php 中的逻辑运算符方程


Logical operators equation in php

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

$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])

结果:真

但是函数中发生了错误,它返回 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;
}

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

=的优先级高于and,所以$a = $b and $c;等于$a = $b;

您必须使用额外的括号 ( $a = ($b and $c); ) 或更好地使用 && 。关于or也是如此(使用 || )。

假设必须评估所有条件:

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

    [...]
    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];
    }
    [...]

在循环中更改以下内容:

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)。

我认为循环中有问题

尝试

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