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

Posted

技术标签:

【中文标题】如何测试多个(2个或更多)布尔值是不是为真【英文标题】:How to test if multiple (2 or more) booleans are true如何测试多个(2个或更多)布尔值是否为真 【发布时间】:2017-03-06 22:29:01 【问题描述】:

我有一堆布尔变量。一些变量可能是 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 答案的性能。

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

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

【问题讨论】:

【参考方案1】:

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

例如:

$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;

DEMO

【讨论】:

【参考方案2】:

最简单的方法(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 次,每个变量一次。

【讨论】:

【参考方案3】:

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

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()

【讨论】:

【参考方案4】:

您可以放置​​一个布尔变量列表并使用 while 循环该列表,并检查当您有 2 个 true 时是否停止。希望对你有所帮助。

【讨论】:

以上是关于如何测试多个(2个或更多)布尔值是不是为真的主要内容,如果未能解决你的问题,请参考以下文章

检查三个布尔值中的两个是不是为真?

加入多个布尔值

检查数组中的所有布尔值是不是为真?

检查数组中的所有值是不是为真,然后返回一个真布尔语句(javascript)[重复]

如何让 NSJSONSerialization 将布尔值输出为真或假?

C# 三个布尔值,一次为真 [关闭]