涉及比较的运算符优先级问题,后跟不带括号的三元表达式

问题描述 投票:0回答:1

所以我不明白为什么下面给出的代码能够像它一样工作。

$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(显然是在本例中),则第二个条件甚至不应该被处理,但是如果我们删除条件的第二部分,它会按例外工作 - 它不会返回任意值。 现在,这个函数确实有返回值。

有人可以解释一下它是如何工作的吗?

php conditional-statements conditional-operator operator-precedence
1个回答
3
投票

您有一个运算符优先级问题:

&&
==
的优先级高于
?:
,因此您的代码被解释为:

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

由于第一个条件为 false,因此计算结果为

'not_existing_value2'
,在布尔上下文中被视为
true

您需要添加括号才能获得您想要的评估顺序:

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

3v4l.org 上的演示

© www.soinside.com 2019 - 2024. All rights reserved.