如何检查20个变量是否都为真,或者20个变量都是假的?
如果可能的话,不使用非常长的时间......
变量实际上是数组元素:
array('a'=> true,'b'=> true ...)
使其更清晰:
答案 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
值。
然后,总结。 array_unique
方式明确地保留了尾部,不用于大型阵列或大量阵列! foreach
方式略微优于in_array
,但唉,代码并不优雅。 array_sum
方式与&#34相同;如果是真的&#34;检查较小(<100)的数组。 (我在array_sum($array) > 0
中挖掘了简单性。)array_filter
方式落后于in_array
和foreach
。如果只有最后一个值不同,foreach
和array_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