如何测试多个(2个或更多)布尔值是否为真


How to test if multiple (2 or more) booleans are true

我有一堆布尔变量。有些变量可以是TRUE,而其他变量可以是FALSE。对于这个例子,我将有十个(10)变量:

//Variables
$a $b $c $d $e $f $g $h $i $j;

目标是在两个或多个变量为真时测试并执行代码。如果我为每个可能的变量组合声明一个条件,那么If语句将变得很长且不可维护。

//Condition Example
if ( ($a && $b) ||
     ($a && $c) ||
     ($a && $d) ||
     ($a && $e) ||
     ($a && $f) ||
     ($a && $g) ||
     ($a && $h) ||
     ($a && $i) ||
     ($a && $j) ||
     ($b && $c) ||
     ($b && $d) ||
     ($b && $e) ||
     ($b && $f) ||
     ($b && $g) ||
     (etc.) ){
        //DO something
}

如何测试是否有2个或更多的变量为TRUE?

,

编辑/添加:

谢谢你的回答。在不同的情况下,使用PHP的array_filter()似乎表现最好。出于好奇,我测试了@AbraCadaver和@Chizzle答案的性能。

低值(1000的数组值5和10为真)

count(array_filter($array)) : Execution time = 0.00319
array_sum($array) : Execution time = 0.00369
implode($array) : Execution time = 0.02098
foreach($array) : Execution time = 0.00939

中间值(数组值1000中的400和500为真)

count(array_filter($array)) : Execution time = 0.00247
array_sum($array) : Execution time = 0.00340
implode($array) : Execution time = 0.01091
foreach($array) : Execution time = 1.00006

大值(数组值950和1000中的1000为真)

count(array_filter($array)) : Execution time = 0.00250
array_sum($array) : Execution time = 0.00329
implode($array) : Execution time = 0.01089
foreach($array) : Execution time = 1.02739

您应该创建一个数组来包含变量。然后遍历它们。

,

$a = true;
$b = false;
$c = true;
$d = false;
$e = false;
$booleanVariables = [
    $a,
    $b,
    $c,
    $d,
    $e
];
$count = 0;
foreach ($booleanVariables  as $variable) {
    if ($variable) {
        $count++;
        // Do something here
    }
}
echo $count;

最简单的方法(IMO)是将它们放入一个数组中,然后遍历它,如果找到两个真值,则缩短循环。你可以把它放在一个函数中,像这样:

<?php
// put vars into array
$varArray = array(
    $a, $b, $c, $d, $e, $f, $g, $h, $i, $j
);
if(twoTrue($varArray)){
    // Do something
}

function twoTrue($arrayOfVars){
    $trueCount = 0;
    foreach($arrayOfVars as $aVar){
        if($aVar)
            $trueCount++;
        if($trueCount >= 2)
            return true;
    }
    return false;
}

最坏的情况是必须在循环中迭代N次,每个变量一次。

我喜欢数组方法,但是如果有超过1,我会过滤掉false值并计数:

if(count(array_filter([$a,$b,$c,$d,$e,$f,$g,$h,$i,$j])) > 1) {
    // yes
}

实际上,经过仔细考虑,true的值为1,false的值为0。

我个人会用这个:

if(array_sum([$a,$b,$c,$d,$e,$f,$g,$h,$i,$j]) > 1) {
    // yes
}

事情总是突然出现在我的脑海里。对于一个true,它将是1,对于两个,它将是11,对于三个111等…

if(implode([$a,$b,$c,$d,$e,$f,$g,$h,$i,$j]) > 1) {
    // yes
}

如果您的PHP版本不支持[]数组,请使用array()

你可以放一个布尔变量列表,然后用while循环列表,并检查当你有2个true时是否停止。我希望这对你有帮助。