【问题标题】:Apply logical operator between array elements in PHP在 PHP 中的数组元素之间应用逻辑运算符
【发布时间】:2017-11-12 20:41:28
【问题描述】:

我有三个array,一个是包含所有布尔值的布尔数组,第二个是条件数组,其中包含和/或布尔数组之间的操作,第三个是路由页面数组,如果表达式为真,则重定向到下一个路由页面,否则不 比如数组

array(2) { [0]=> bool(true) [1]=> bool(false) ...} // boolean array
array(2) { [0]=> string(2) "or" [1]=> string(0) "" ...} // conditional operator array
array(2) { [0]=> string(1) "2" [1]=> string(1) "2" ... } // route page 

表达式将被设为(bool(true) or bool(false)),因此结果将是bool(true) final,因此它将重定向到第二页,即我需要循环中的递归表达式

这是我应用的代码

 for($i=0;$i<count($boolean);$i++)
           {
               if($and_or[$i]=='and')
               {
                   $operator='&&';
               }
               else
               {
                   $operator='||';
               }
               $result=($boolean[$i].$operator.$boolean[$i+1]);

           }
           var_dump($result);

【问题讨论】:

  • 条件运算符数组的第二个元素是否有空值?
  • 一些问题:递归与此有什么关系?第三个数组与问题相关吗?一些评论:您正在做的是附加字符串,而不是应用逻辑运算符。使用您的代码,您还将使用$boolean[$i+1] 超出数组的末尾。
  • 是的,空白值表示条件运算符的结束,不再进行提前操作
  • @Gerriet 那么如何解析和制作表达式,第三个数组是最终结果,如果表达式似乎为真,则页面重定向将在那里,我在页面逻辑中应用此条件的调查。更多详情stackoverflow.com/questions/44434757/…

标签: php arrays recursion logical-operators


【解决方案1】:

由于我不喜欢建议答案的复杂性,我深入挖掘并最终扫描了http://php.net/manual/en/ref.array.php 中列出的数组函数。

这些在性能方面可能不是最好的,但很简单,如果您不应用于大型阵列,我不会考虑性能损失。

对于逻辑 AND (&&),请使用:

var_export(!in_array(false,array(true,true,false,false,true,false))); //false

或者这个:

var_export((bool)array_product(array(true,true,false,false,true,false))); //false

对于逻辑 OR (||) 使用:

var_export(in_array(true,array(true,true,false,false,true,false))); //true

或者这个:

var_export(array_search(true,array(true,true,false,false,true,false))!==false); //true

我猜测 in_array 会更快。但是随着 PHP 7 的推出,谁知道呢……

【讨论】:

    【解决方案2】:

    试试下面的代码:

    for( $i = 0; $i < count( $boolean ); $i++ ) {
        switch( $and_or[ $i ] ) {
            case '&&':
            case 'and':
                $result = $boolean[ $i ] && $boolean[ $i + 1 ];
                break;
            case '||':
            case 'or':
                $result = $boolean[ $i ] || $boolean[ $i + 1 ];
                break;
        }
        var_dump( $result );
    }
    

    您还可以使用andor 运算符。 如果你有两个以上的操作符,你可以像这样使用eval函数:

    $boolean = [1,0,0];
    $o = ['&&','or'];
    echo $r = "return ($boolean[0] $o[0] $boolean[1]) $o[1] $boolean[2];";
    var_dump( eval($r) );
    

    【讨论】:

    • 如果数组中有两个以上的布尔条件是否适用,假设布尔值中有三个值,如果(1和2)之间存在或操作,则适用,然后此结果将适用于三 (3) 和条件 –
    • 但是and or 条件是动态的,它是用户定义的array(2) { [0]=> string(2) "or" [1]=> string(0) "" ... } , 用户将定义
    • @testqa 你可以从用户那里得到一个逻辑字符串并传递给eval函数来执行它。关心安全问题。
    • 我的问题是我如何区分如果有两个布尔值或三个然后相应地 echo $r = "return ($boolean[0] $o[0] $boolean[1]) $o[ 1] $布尔[2];";我的意思是说它应该动态工作
    • 你提出了一个关于 eval 的好主意,谢谢你能不能详细说明一下如何动态地使它成为逻辑表达式,这只是我的主要问题意味着这个表达式 echo $r = "return ($boolean [0] $o[0] $boolean[1]) $o[1] $boolean[2];";应该动态制作
    【解决方案3】:

    也许这会让你更接近你的目标:

     for($i=0;$i<count($boolean)-1;$i++)
     {
       if ($i < count($and_or) && !empty($and_or[$i]) {
         if($and_or[$i]=='and')
         {
               $operator='&&';
               $result = $boolean[$i] && $boolean[$i+1];
         }
         else
         {
              $operator='||';
              $result = $boolean[$i] || $boolean[$i+1];
         }
         $operation=($boolean[$i].$operator.$boolean[$i+1]);
     }
     var_dump($operation);
     var_dump($result);
    

    请注意,大多数布尔值使用了两次(第二个值是第一个操作的第二个运算符,第二个操作的第一个运算符)。

    【讨论】:

    • 如果数组中有两个以上的布尔条件是否适用,假设布尔值中有三个值,如果(1和2)之间有or操作,它是否适用然后这个结果将适用于三 (3) 和条件
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多