php 运算符优先级问题,涉及比较后接无括号的三元表达式

ngynwnxp  于 5个月前  发布在  PHP
关注(0)|答案(1)|浏览(58)

所以我不明白为什么下面给出的代码不像它的工作原理。

$values = [
    [
      'key' => 'value',
      'key2' => 'value2'
    ]
];

function filter($values, $flag = false) {
    return array_filter(
        $values,
        function ($record) use ($flag) {
            return $record['not_existing_key'] == 'not_existing_value'
                && $record['not_existing_key2'] == $flag ? '' : 'not_existing_value2';
        }
    );
}

print_r(filter($values));

字符串
上面代码的输出是:

Array
(
    [0] => Array
        (
            [key] => value
            [key2] => value
        )

)


根据我对PHP中&&操作符的理解,如果第一个条件为false,第二个条件甚至不应该被处理(在本例中显然是这样),但是如果我们删除条件的第二部分,它将作为except工作-它不返回任何值。
有人能解释一下它是如何工作的吗?

blpfk2vs

blpfk2vs1#

你有一个operator precedence问题:&&==的优先级高于?:,所以你的代码被解释为:

($record['not_existing_key'] == 'not_existing_value'
&& $record['not_existing_key2'] == $flag) ? '' : 'not_existing_value2';

字符串
由于第一个条件为假,因此其评估为'not_existing_value2',在布尔上下文中被认为是true
您需要添加括号以获得所需的计算顺序:

return $record['not_existing_key'] == 'not_existing_value'
    && $record['not_existing_key2'] == ($flag ? '' : 'not_existing_value2');


Demo on 3v4l.org

相关问题