数字键数组用+会静默丢数据:+是左优先补缺,同键时右侧被忽略;array_merge则右覆盖左且重排数字键,更安全可靠。

数字键数组用+会静默丢数据
这是最常踩的坑:用 + 合并两个纯数字索引数组,后一个数组的同键值直接消失,且不报错、不警告。
比如:
$a = [0 => 'x', 1 => 'y'];<br>$b = [0 => 'u', 1 => 'v'];<br>var_dump($a + $b); // [0 => 'x', 1 => 'y'] —— $b 完全没进去
-
array_merge($a, $b)会顺序拼接并重排键:[0 => 'x', 1 => 'y', 2 => 'u', 3 => 'v'] -
+是“左优先补缺”,不是“合并”;只要键已存在,右侧一律忽略 - 循环构造列表、JSON 输出、数据库批量插入等场景,错用
+就等于漏掉一半数据
字符串键时覆盖逻辑相反
同样是键冲突,array_merge 和 + 的行为刚好反过来——别凭直觉猜。
示例:
$defaults = ['host' => 'localhost', 'port' => 3306];<br>$user = ['port' => 5432, 'ssl' => true];<br>var_dump(array_merge($defaults, $user)); // ['host'=>'localhost', 'port'=>5432, 'ssl'=>true]<br>var_dump($defaults + $user); // ['host'=>'localhost', 'port'=>3306, 'ssl'=>true]
-
array_merge:右覆盖左(后写入的值生效) -
+:左保留右忽略(先定义的值锁死) - 配置合并场景中,想让用户传参“强制覆盖默认值”,必须用
array_merge;想“只补充缺失项”,才用+
null 或非数组参数会让+直接崩溃
+ 运算符对类型极其敏感,遇到 null、string、int 等非数组类型,PHP 直接抛出 Fatal error;而 array_merge 在 PHP 7.x 中仅发 warning,PHP 8.0+ 升级为 TypeError,但至少可捕获。
- 动态构建参数时(如
array_merge($a, $optional_b, $c)),若$optional_b未定义或为null,array_merge自动跳过,结果等价于array_merge($a, $c) - 用
+必须提前过滤:$optional_b ?: [],否则运行时中断 - 函数返回值不确定是否为数组(如某些 SDK 方法可能返回
false或null),一律禁用+
混合键数组会让+的行为难以预测
当一个数组同时含数字键和字符串键(比如 [0 => 'a', 'name' => 'bob']),+ 仍按“左优先”处理所有键,但数字键不会被重排;而 array_merge 只重排数字键部分,字符串键照常右覆盖。
- 这种混合结构在表单数据、API 响应里很常见,用
+容易误以为“合并成功”,实则数字部分被截断、关联部分又没覆盖到位 - 没有银弹:如果数组结构不可控,
array_merge更可预期;如果明确是纯关联键且需左优先策略,再考虑+ - 团队协作中,
+看起来像算术运算,新人极易误解其语义——这点比性能差异更值得警惕
+ 的场景极少;多数所谓“简洁写法”,本质是用模糊语义换来的短期便利。数字键存在、参数可能为空、结构混合——这三个条件满足任一,array_merge 就是唯一安全选择。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











