array_merge参数顺序决定覆盖与追加行为:后数组覆盖前数组字符串键,数字键追加重排;+运算符左优先合并不覆盖冲突键;array_replace不重排数字键仅覆盖;null参数致array_merge返回null需兜底处理。

array_merge 的参数顺序直接影响覆盖结果
会,而且影响非常直接。传入 array_merge() 的数组顺序决定了谁的值最终生效:后面的数组会覆盖前面同名的字符串键,数字键则被追加并重排。这不是“可能影响”,而是函数定义行为。
常见错误现象是:配置合并时把默认项放后面,结果自定义项全被清空;或者误以为“先出现的更权威”,实际恰恰相反。
- 字符串键(如
'host'、'timeout'):后一个数组的值无条件覆盖前一个 - 数字键(如
0、1):不覆盖,只追加,且索引从0重新开始计数 - 混合键数组:字符串键走覆盖逻辑,数字键走重排逻辑,互不干扰
+ 运算符的顺序效果完全相反
+ 不是“加法”,是左优先合并。它保留左侧数组所有键值,只把右侧数组中“左侧不存在的键”补上去。一旦键名冲突,右侧直接被丢弃。
典型使用场景是补全默认配置:$config = $defaults + $user_input —— 这样能确保 $user_input 里没填的项自动 fallback 到 $defaults。
- 若写成
$user_input + $defaults,用户填了什么就只有什么,缺项不会补,默认值彻底失效 -
+对数字键也保持原键名,不重排;而array_merge()一视同仁重排所有数字键 -
+遇到null或非数组类型会静默失败(返回原左操作数),array_merge()则直接返回null
array_replace 的顺序和 array_merge 一致但行为更可控
array_replace() 和 array_merge() 一样,也是后数组覆盖前数组,但它**不重排数字键**。也就是说,它只处理“覆盖”,不处理“追加+重索引”。
例如:array_replace([0 => 'a', 1 => 'b'], [1 => 'x', 2 => 'c']) 返回 [0 => 'a', 1 => 'x', 2 => 'c'];而 array_merge() 会把第一个数组的 0、1 和第二个的 1、2 全部重排成 0→3。
- 需要保留原始数字键位置(比如用数字键表示步骤序号、选项 ID)时,
array_replace()比array_merge()更安全 -
array_replace()不接受纯数字索引的“追加语义”,它只做键对键替换 - PHP 5.3+ 可用,比
+更明确表达“覆盖意图”,比array_merge()更少副作用
容易被忽略的 NULL 输入陷阱
array_merge() 对非数组参数极度敏感。只要任一参数是 null、false、字符串或整数,整个调用就返回 null,而不是跳过或报错。
这在数据库查询结果为空、API 返回未定义字段、缓存未命中等场景下极易引发静默故障——你拿到的是 null,但代码继续往下跑,直到某个 foreach 报 Invalid argument supplied for foreach() 才暴露问题。
- 务必在调用前检查每个参数是否为数组:
is_array($a) && is_array($b) - PHP 7.4+ 支持无参调用
array_merge()返回空数组,但不能解决已有null参数的问题 - 用
?? []做兜底比层层is_array()更简洁:array_merge($a ?? [], $b ?? [])
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











