如何测试多个(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)[重复]