PHP foreach循环中三元表达式引发输出异常的问题排查
PHP foreach循环中三元表达式导致数据丢失的排查思路
问题现象
在foreach循环内使用三元表达式标记数组中id为3的行时,第一个循环丢失了id=3的条目;第二个无三元表达式的普通循环则能正常显示所有数据。
代码示例
$arr = array( array('id' => 1,'name' => 'Peter'), array('id' => 2,'name' => 'Ben'), array('id' => 3,'name' => 'Joe'), array('id' => 4,'name' => 'Smith'), array('id' => 5,'name' => 'Josh'), ); $select = 3; echo "<br/><br/>"; foreach ($arr as $a) { echo $a['id'] == $select ? '->' : "" . ' "value="' . $a["id"] . ' "name"=' . $a["name"] . "<br/>"; }; echo "<br/><br/>"; foreach ($arr as $a) { echo ' "value="' . $a["id"] . ' "name"=' . $a["name"] . "<br/>"; };
输出结果
//First foreach with selection mark "value="1 "name"=Peter "value="2 "name"=Ben -> "value="4 "name"=Smith "value="5 "name"=Josh //Second foreach "value="1 "name"=Peter "value="2 "name"=Ben "value="3 "name"=Joe "value="4 "name"=Smith "value="5 "name"=Josh
排查与修复
核心问题:运算符优先级错乱
PHP中字符串连接符.的优先级高于三元运算符?:,导致代码逻辑被错误解析。原代码中,"" . ' "value="' . ...会优先执行拼接,三元表达式实际逻辑变为:$a['id'] == $select ? '->' : ("" . ' "value="' . $a["id"] . ' "name"=' . $a["name"] . "<br/>")当
$a['id']=3时,三元表达式返回'->',仅输出这个标记,后面的id=3的内容完全没被执行输出,所以看起来像是丢失了条目。修复方案
给三元表达式加上括号,确保先执行条件判断,再将结果与后续字符串拼接:foreach ($arr as $a) { echo ($a['id'] == $select ? '->' : "") . ' "value="' . $a["id"] . ' "name"=' . $a["name"] . "<br/>"; };修改后,id=3的条目会正常输出带
->标记的内容。
内容的提问来源于stack exchange,提问作者Daniel Nik
相关产品推荐
相关产品推荐

