如何检查20个变量是否全部为true或全部为false?
如果可能,不使用非常长的if语句来实现。
这些变量实际上是数组元素:
array('a'=> true, 'b'=> true ...)
为了更清楚地说明:
- 如果数组同时包含true和false值,则返回空。
- 如果数组只包含true值,则返回true。
- 如果数组只包含false值,则返回false。 :)
如何检查20个变量是否全部为true或全部为false?
如果可能,不使用非常长的if语句来实现。
这些变量实际上是数组元素:
array('a'=> true, 'b'=> true ...)
为了更清楚地说明:
if(count(array_unique($your_array)) === 1)
return current($your_array);
else return;
if(in_array(false, $array, true) === false){
return true;
}
else if(in_array(true, $array, true) === false){
return false;
}
else{
return 'nothing';
}
可以像php.net的评论中所示,使用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
虽然这个问题很古老,但是无妨。我想要对不同的方法进行基准测试。由于in_array()
方法可能不需要迭代整个数组,所以它的表现最佳。 (即使最后只有一个唯一的布尔值,也很少需要迭代整个数组,但即便如此,它的性能仍然很好。)
这里没有提到的一种方法是array_sum($array)
,如果所有的值都是false
,则返回0
;如果存在true
值,则返回1+
。类似于使用array_filter
的方法,它不能告诉您两者是否都存在,但用于查找任何内容是否为true
非常有用。我还添加了一个基本的foreach
检查混合或全部为真/假,以及一个只检查是否存在任何true
的in_array
(如下面的*_bin
)。
这里是基准测试结果。每个情况都会迭代10、100或1000个随机布尔值的数组100000次,并且再次迭代9、99和999个相同的布尔值,最后一个布尔值是唯一的(为了让in_array
进行完整的迭代时间)。测试前三个检查产生请求的true/false/both
结果,其余四个仅检查是否存在true
值。
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'; // =^_^=
}
}
顺便说一句,可以在上面使用 'null',但是这样读起来更有趣。在 Windows 上进行了基准测试,因此微秒读数不太精确。
array_sum($array) > 0
- Potherca> 0
。 - mickmackusa此外,您可以拥有一个变量列表(不仅限于值数组),以检查所有值是否与某个特定值匹配。
$var1 = true;
$var2 = true;
$var3 = false;
$isAllVarsTrue = !in_array(false, [$var1, $var2, $var3], true);
var_dump($isAllVarsTrue); //false
如果你只存储布尔值,使用这个:
$a = array('a'=> true, 'b'=> true, 'c'=>true);
$af = array_filter($a);
if ($af == $a) {
echo "all true";
}
if (empty($af)) {
echo "all 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';
$new = array_flip($array);
if (!isset($array[false]) && isset($array[true])) {
... there's no false values, and at least one true value
}
对于大型数组来说,这可能会变得很昂贵,因此您可以尝试使用array_unique()函数。这将返回一个最多只包含两个值(一个true和一个false)的数组。
好吧,那么上面的方法行不通。我们采用简单的方法:
if (in_array($yourarray, false, TRUE)) {
... at least one non-true value
}
// 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
array_unique
函数来删除所有重复的元素,然后检查数组中是否只剩下一个项,是的话就返回它。举例来说,如果数组只包含true
,那么经过array_unique
处理后,我们将得到一个只有一个true
元素的数组,没有其他元素了。 - TCB13