【问题标题】: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

【问题讨论】:

    标签: php if-statement logic conditional-statements


    【解决方案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 时是否停止。希望对你有所帮助。

          【讨论】:

            猜你喜欢
            • 2021-10-10
            • 2019-04-07
            • 2010-09-27
            • 1970-01-01
            • 2013-09-18
            • 1970-01-01
            • 1970-01-01
            • 2021-11-14
            • 2010-10-05
            相关资源
            最近更新 更多