array_merge()以右覆盖字符串键、重索引数字键,+运算符以左保留字符串键、并集数字键;前者多数组安全但类型严格,后者双操作宽松但易漏数据。

PHP 中 array_merge() 和 + 运算符都能合并数组,但底层逻辑完全不同——选错可能悄悄覆盖数据或丢失元素,尤其在配置合并、表单默认值、多维结构处理时容易出错。
字符串键的覆盖逻辑相反
遇到相同字符串键(如 'host'、'timeout')时:
-
array_merge($a, $b):后面数组的值覆盖前面的,以右为准。适合“后配置覆盖前配置”场景,比如环境变量叠加。 -
$a + $b:前面数组的值保留,后面同名键被忽略,以左为准。适合“默认值优先”,比如函数参数补全:$options += ['limit' => 10];
数字键(索引键)行为截然不同
对纯数字键(如 [0=>'a', 1=>'b']):
-
array_merge():丢弃原键,合并后从0开始连续重索引。结果是所有值拼接,不丢失。 -
+运算符:按键名做“并集”,$a[0]存在则$b[0]直接跳过。结果只保留左侧数组的全部元素,右侧仅追加左侧**不存在的键**(如$a = [0=>'x']; $b = [2=>'y']; $a + $b → [0=>'x', 2=>'y'])。
参数数量与类型容错性
实际使用中这些细节常被忽略:
-
array_merge()支持任意多个数组:array_merge($a, $b, $c, $d);+只能两两运算,写多个需嵌套:$a + $b + $c等价于($a + $b) + $c。 -
array_merge()要求每个参数必须是数组,传null或字符串会报 Warning;+会自动把null当空数组、字符串转为[0 => 'str'],更宽松但可能掩盖类型错误。
什么时候该用哪个?
记住两个典型模式:
- 要“叠加+去重+保留左侧主干” → 用
+,比如合并默认配置和用户配置。 - 要“彻底融合+允许右侧覆盖+统一重排索引” → 用
array_merge(),比如收集多个查询条件、日志上下文拼接。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











