array_merge() 覆盖字符串键、重索引数字键,+ 保留左侧键值且不重索引;前者类型严格、支持多参数,后者容错但易埋隐患,适用于不同合并策略。

array_merge 会覆盖字符串键,+ 保留左侧值
遇到相同字符串键(比如 'name'、'id')时,array_merge() 总是用后一个数组的值覆盖前一个;而 + 运算符完全忽略右侧数组中已存在于左侧的键,只保留左侧原始值。
-
array_merge(['a' => 1], ['a' => 2])→['a' => 2] -
(['a' => 1] + ['a' => 2])→['a' => 1]
这个差异直接决定你是否需要“以右为准”还是“以左为准”。比如配置合并时想让传入参数优先,选 array_merge;想让默认配置兜底、仅补充缺失项,+ 更安全。
数字键处理完全不同:重索引 vs 保留原键
对纯数字索引数组(如 [10, 20]),array_merge() 必然重索引为连续整数,+ 则严格按键存在与否判断——只要左侧已有 0 和 1,右侧同键值就被丢弃。
-
array_merge([10, 20], [30, 40])→[0 => 10, 1 => 20, 2 => 30, 3 => 40] -
([10, 20] + [30, 40])→[0 => 10, 1 => 20](右侧0、1键冲突,被跳过) -
([0 => 10, 2 => 20] + [1 => 30, 3 => 40])→[0 => 10, 2 => 20, 1 => 30, 3 => 40](无冲突,全部保留)
所以别指望 + 能“追加”数字索引数组——它不是拼接,是键级并集。
类型容错性差异:null 和非数组参数
array_merge() 对参数类型敏感,传 null 或字符串会触发 Warning: array_merge(): Argument #2 is not an array;+ 运算符会把 null 当作空数组,其他标量转成单元素数组(但通常这不是你想要的)。
-
array_merge(['x' => 1], null)→ 报警告,返回false(PHP 8.0+)或部分结果 -
(['x' => 1] + null)→ 正常执行,等价于['x' => 1] + [] -
(['x' => 1] + 'hello')→ 实际变成['x' => 1] + [0 => 'hello'],极易引发逻辑错误
这意味着:如果输入来源不可控(比如用户传参、API 响应),+ 表面更“宽容”,实则埋雷;array_merge() 报错反而是提醒你校验数据。
不能链式调用 +,且只支持两个操作数
+ 是二元运算符,$a + $b + $c 在 PHP 中合法,但等价于 ($a + $b) + $c —— 每次都只作用于两个数组。而 array_merge() 可接收任意数量参数:array_merge($a, $b, $c, $d) 一步到位。
- 要合并三个关联数组并让后一个覆盖前一个?用
array_merge($a, $b, $c) - 想逐层 fallback($a 缺失才用 $b,$b 缺失才用 $c)?得写
$a + $b + $c,但注意顺序不能错
另外,+ 不支持解构或动态参数列表;array_merge(...$arrays) 才是处理变长数组合并的正解。
真正容易被忽略的是混合键数组场景:既有数字键又有字符串键时,+ 的“保留左侧”逻辑依然生效,但开发者常误以为它像 array_merge 那样对两类键分别处理。实际上,它一视同仁——键存在即跳过,不管类型。这点在调试配置合并失败时,往往卡住半天才发现是键名重复而非逻辑写错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











