我有一堆布尔变量。有些变量可以是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时是否停止。我希望这对你有帮助。