检查多个值是否全为false或全部为true

时间:2011-07-27 19:57:29

标签: php conditional boolean conditional-statements boolean-logic

如何检查20个变量是否都为真,或者20个变量都是假的?

如果可能的话,不使用非常长的时间......

变量实际上是数组元素:

array('a'=> true,'b'=> true ...)

使其更清晰:

  • 如果数组同时具有true和false值则不返回任何内容
  • 如果数组只有true值,则返回true
  • 如果数组只有false值,则返回false :)

10 个答案:

答案 0 :(得分:48)

if(count(array_unique($your_array)) === 1)  
  return current($your_array);

else return;

答案 1 :(得分:19)

您可以使用in_array

实施例。为了所有的真实:

if(in_array(false, $array, true) === false){
    return true;
}
else if(in_array(true, $array, true) === false){
    return false;
}
else{
     return 'nothing';
}

答案 2 :(得分:10)

可以使用php.net in a comment所示的array_product

$check[] = boolval(TRUE);
$check[] = boolval(1);
$check[] = boolval(FALSE);
$check[] = boolval(0);

$result = (bool) array_product($check);
// $result is set to FALSE because only two of the four values evaluated to TRUE

答案 3 :(得分:4)

一个简单的循环就行了。请注意,如果数组为空,则满足两个条件(全部为false且全部为真)。你不会在结果中看到这个,因为其他的,但你可以自己找出你想要如何处理它。

// Input
$x = array ('a'=>false, 'b'=>false, 'c'=>false);

// Initialization
$anytrue = false;
$alltrue = true;

// Processing
foreach($x as $k=>$v)
{
    $anytrue |= $v;
    $alltrue &= $v;
}

// Display result
if ($alltrue)
  echo 'All elements are true';
elseif (!$anytrue)
  echo 'All elements are false';
else
  echo 'Mixed values';

答案 4 :(得分:3)

如果您只存储布尔值,请使用:

$a = array('a'=> true, 'b'=> true, 'c'=>true);
$af = array_filter($a);
if ($af == $a) {
    echo "all true";
}
if (empty($af)) {
    echo "all false";
}

注意:如果数组中有其他值,则根据PHP的可怕转换规则将它们转换为布尔值。

答案 5 :(得分:3)

这个问题很古老,但无论如何。我想对不同的方法进行基准测试。 in_array()方法表现最佳,因为它可能不需要遍历整个数组。 (赔率很低,你最后只有一个独特的布尔值,但即便如此,它也表现良好。)

此处未提及的一种方法是array_sum($array),如果所有值均为0则返回false,如果有1+值,则返回true某处。与array_filter方法一样,它不会告诉您两者是否存在,但有助于查明是否有true。我还在基本的foreach检查中添加了混合或全部真/假,并添加了in_array,只检查是否有true(下面为*_bin)。

所以这是基准。每个案例使用10,100或1000个随机布尔值的阵列迭代100000次;再次使用9,99和999个相同的布尔值,最后一个是唯一的(in_array具有完整的迭代时间)。测试的前三个检查产生所请求的true/false/both结果,其余四个只检查是否存在true值。

RANDOM BOOLEANS

  • in_array :10个bools = 0.16秒
  • foreach :10 bools = 0.122 sec
  • array_unique :10 bools = 0.274 sec
  • foreach_bin :10 bools = 0.095 sec
  • in_array_bin :10 bools = 0.073 sec
  • array_sum :10个bools = 0.074秒
  • array_filter :10个bools = 0.118秒
  • in_array :100 bools = 0.153 sec
  • foreach :100 bools = 0.122 sec
  • array_unique :100 bools = 2.3451 sec
  • foreach_bin :100 bools = 0.094 sec
  • in_array_bin :100 bools = 0.074 sec
  • array_sum :100 bools = 0.126 sec
  • array_filter :100 bools = 0.228 sec
  • in_array :1000 bools = 0.154 sec
  • foreach :1000 bools = 0.149 sec
  • array_unique :1000 bools = 32.6659 sec(!!)
  • foreach_bin :1000 bools = 0.075 sec
  • in_array_bin :1000 bools = 0.074 sec
  • array_sum :1000 bools = 0.8771 sec
  • array_filter :1000 bools = 1.4021 sec

最后的布尔人差异

  • in_array :10个bools = 0.152秒
  • foreach :10 bools = 0.342 sec
  • array_unique :10个bools = 0.269秒
  • foreach_bin :10 bools = 0.074 sec
  • in_array_bin :10个bools = 0.076秒
  • array_sum :10个bools = 0.074秒
  • array_filter :10 bools = 0.121 sec
  • in_array :100 bools = 0.159 sec
  • foreach :100 bools = 2.8072 sec
  • array_unique :100 bools = 2.7702 sec
  • foreach_bin :100 bools = 0.074 sec
  • in_array_bin :100 bools = 0.09 sec
  • array_sum :100 bools = 0.118 sec
  • array_filter :100 bools = 0.248 sec
  • in_array :1000 bools = 0.312 sec
  • foreach :1000 bools = 27.5256 sec
  • array_unique :1000 bools = 42.1594 sec
  • foreach_bin :1000 bools = 0.074 sec
  • in_array_bin :1000 bools = 0.24 sec
  • array_sum :1000 bools = 0.555 sec
  • array_filter :1000 bools = 1.3601 sec

然后,总结。 array_unique方式明确地保留了尾部,不用于大型阵列或大量阵列! foreach方式略微优于in_array,但唉,代码并不优雅。 array_sum方式与&#34相同;如果是真的&#34;检查较小(<100)的数组。 (我在array_sum($array) > 0中挖掘了简单性。)array_filter方式落后于in_arrayforeach。如果只有最后一个值不同,foreacharray_unique都会拖得不好。

最后,foreach功能可以提供良好的幽默感。很可读。 真相就在那里!

function foreach_truth_test($array)
{   
    $trues = $falses = false;

    foreach($array as $val) {
        if ($val === true) {
            $trues = true;
        } elseif ($val === false) {
            $falses = true;
        }
        if ($trues === true && $falses === true) {
            return 'both'; // Enough information.
        }
    }

    // Regular Universe
    if ($trues === true && $falses === false) {
        return 'true';
    } // Evil Mirror Universe
    elseif ($trues === false && $falses === true) {
        return 'false';
    } // Intergalactic Void
    else {
        return 'void'; // =^_^=
    }
}

P.S。可以使用&#39; null&#39;以上,但这样看起来更有趣。在Windows上进行基准测试,因此微量时间读数非常粗糙。

答案 6 :(得分:2)

如果它们都是具有true / false值的数组元素,那么使用array_flip():

<击>     $new = array_flip($array); if (!isset($array[false]) && isset($array[true])) { ... there's no false values, and at least one true value }

对于大型阵列来说,这可能会变得昂贵,因此您可能希望尝试使用array_unique()。你得到一个最多有两个值的数组(一个是真的,一个是假的)。


好的,这样就行不通了。简单的霰弹枪方法:

if (in_array($yourarray, false, TRUE)) {
   ... at least one non-true value
}

答案 7 :(得分:2)

更多的是你可以列出变量(不仅仅是一个值数组)来检查所有值与特定值的对比。

$var1 = true;
$var2 = true;
$var3 = false;

$isAllVarsTrue = !in_array(false, [$var1, $var2, $var3], true);

var_dump($isAllVarsTrue); //false

答案 8 :(得分:1)

使用for循环。如果要检查所有变量是否为false,可以使用for循环:一旦找到true元素就可以打破循环,否则变量都是false。如果要检查所有变量是否为真,可以使用相同的方法。

答案 9 :(得分:0)

// set default value
$result = false;

foreach ($array as $key => $value) {
    if ($value === true) {
        $result = true;
        break;
    } 
}

// $result is now true if any value was true, otherwise it's false