【问题标题】:Logical operators equation in phpphp中的逻辑运算符方程
【发布时间】:2016-01-27 09:55:03
【问题描述】:

我的函数有问题,它应该根据数组中的数据组合逻辑运算符:

$arr = array(
    0 => array(false, "or"),
    1 => array(false, "or"),
    2 => array(true)
);

等式应该是:

  • 假或假或真
  • ($arr[0][0] $arr[0][1] $arr[1][0] $arr[1][1] $arr[2][0]) em>

结果:真

但是函数中发生了错误,它返回 false。 我错过了什么?

var_dump( arrayBoolValidation($arr) );

function arrayBoolValidation (array $arr) {
    $num = count($arr);
    $status = $arr[0][0];
    for($i = 1; $i < $num; ++$i) {
        if ($arr[$i-1][1] == "and") {
            $status = filter_var($status, FILTER_VALIDATE_BOOLEAN) and filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN);
        } else if ($arr[$i-1][1] == "or") {
            $status = filter_var($status, FILTER_VALIDATE_BOOLEAN) or filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN);
        }
    }
    return $status;
}

【问题讨论】:

标签: php logical-operators


【解决方案1】:

这是一个运算符优先级问题。 and&amp;&amp; 不同。看http://php.net/manual/en/language.operators.precedence.php

= 的优先级高于and,因此$a = $b and $c; 等于$a = $b;

您必须使用额外的括号 ($a = ($b and $c);) 或更好地使用 &amp;&amp;or 也一样(使用 ||)。

【讨论】:

    【解决方案2】:

    假设必须评估所有条件:

    注意:我添加了没有定义运算符的情况。

        [...]
        if (!isset($arr[$i-1][1])) {
            $status = $status || $arr[$i][0];  // default: OR, && else
        } else if ($arr[$i-1][1] == "and") {
            $status = $status && $arr[$i][0];
        } else if ($arr[$i-1][1] == "or") {
            $status = $status || $arr[$i][0];
        }
        [...]
    

    【讨论】:

      【解决方案3】:

      在循环中更改以下内容:

      if ($arr[$i-1][1] == "and") {
          $status = (filter_var($status, FILTER_VALIDATE_BOOLEAN) and filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN));
      } else if ($arr[$i-1][1] == "or") {
          $status = (filter_var($status, FILTER_VALIDATE_BOOLEAN) or filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN));
      }
      

      你会看到额外的括号。

      如果你不放它们,你将 $status 设置为 filter_var($status, FILTER_VALIDATE_BOOLEAN),它总是与第一个条目相同(在这种情况下为 false)。

      【讨论】:

      • 谢谢!不知道 = 的优先级高于 and
      【解决方案4】:

      我认为循环有问题

      试试,

      for($i = 1; $i <=$num; ++$i) {
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        • 2019-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        相关资源
        最近更新 更多