所以我不明白为什么下面给出的代码能够像它一样工作。
$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(显然是在本例中),则第二个条件甚至不应该被处理,但是如果我们删除条件的第二部分,它会按例外工作 - 它不会返回任意值。
现在,这个函数确实有返回值。
有人可以解释一下它是如何工作的吗?
您有一个运算符优先级问题:
&&
和==
的优先级高于?:
,因此您的代码被解释为:
($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');