PHP:能否用三元运算符向数组追加无内容以维持原数组状态?
实现需求的解决方案
首先明确:直接用$new_arr[] = 三元表达式的方式无法实现目标,因为不管三元的else分支是什么,[]=都会强制向数组追加元素(哪怕是空数组)。要达成「存在指定键则追加对应值,不存在则不操作」的效果,可通过以下方式利用三元运算符实现:
方法1:结合数组合并使用三元运算
将三元运算的结果设为「包含目标值的数组」或「空数组」,再合并到新数组中。空数组合并后不会对原数组产生任何影响,代码示例:
<?php $source_arr = ["Car" => "Volvo", "City" => "Stockholm", "Country" => "Sweden"]; $new_arr = []; // 存在键则合并含对应值的数组,否则合并空数组 $new_arr = array_merge($new_arr, key_exists("Car", $source_arr) ? [$source_arr["Car"]] : []); $new_arr = array_merge($new_arr, key_exists("State", $source_arr) ? [$source_arr["State"]] : []); echo "<pre>"; var_export($new_arr); echo "</pre>"; ?>
执行后输出符合预期:
array ( 0 => 'Volvo', )
方法2:利用逻辑与的短路特性(非严格三元,但更简洁)
如果不严格限定必须用三元运算符,还可以用逻辑与&&的短路特性:当条件为真时才执行后续的追加操作,条件为假时直接跳过,代码示例:
<?php $source_arr = ["Car" => "Volvo", "City" => "Stockholm", "Country" => "Sweden"]; $new_arr = []; key_exists("Car", $source_arr) && $new_arr[] = $source_arr["Car"]; key_exists("State", $source_arr) && $new_arr[] = $source_arr["State"]; echo "<pre>"; var_export($new_arr); echo "</pre>"; ?>
这种写法比三元更直观,完全匹配需求。
原代码不符合预期的原因
原代码中$new_arr[] = (...) ? ... : []的逻辑是:无论条件是否成立,都会执行$new_arr[]的追加操作,只是追加的内容不同——条件不成立时会追加一个空数组元素,这就是结果里出现空数组项的原因。
内容的提问来源于stack exchange,提问作者Gowire
相关产品推荐
相关产品推荐

