array_merge会重置数字键,array_replace保留原数字键;字符串键时两者均覆盖,但语义不同:前者强调合并重排,后者强调精准替换;多维数组中二者均不递归,深层合并需array_merge_recursive或自定义逻辑。

array_merge 会重索引数字键,array_replace 不会
这是最常踩坑的地方。如果你合并的是纯数字索引数组(比如 [0 => 'a', 1 => 'b']),array_merge 会把所有数字键清零并连续重排:array_merge([0=>'a'], [0=>'b']) 返回 [0=>'a', 1=>'b'];而 array_replace 保留原始键名:array_replace([0=>'a'], [0=>'b']) 返回 [0=>'b'](右侧覆盖左侧,不新增索引)。
常见错误现象:用 array_merge 合并配置项或表单数据后,发现原本带数字键的列表顺序错乱、下标跳变,甚至 foreach 逻辑出错。
- 数字键场景优先选
array_replace(如:更新用户提交的带索引字段) - 需要拼接两个纯索引数组(如日志条目追加)才用
array_merge - PHP 7.4+ 支持空参调用
array_merge(),但array_replace()至今仍要求至少一个参数
关联数组下 array_merge 和 array_replace 行为一致,但语义不同
对字符串键(如 ['name' => 'foo']),两者都用右侧值覆盖左侧同名键,结果完全相同:array_merge(['a'=>1], ['a'=>2]) 和 array_replace(['a'=>1], ['a'=>2]) 都返回 ['a'=>2]。
但它们的「意图」不同:array_merge 是“合并并可能重排”,array_replace 是“有选择地替换已有键”。这种语义差异会影响代码可读性和维护性。
立即学习“PHP免费学习笔记(深入)”;
- 做默认配置填充(如
$config = array_replace($defaults, $user_input))时,用array_replace更准确 - 用
+运算符等价于array_replace($right, $left),注意参数顺序相反 - 不要依赖“行为一致”就混用——一旦数组里混入数字键,
array_merge就会悄悄改变结构
array_replace 支持多维数组的非递归替换,array_merge_recursive 才递归
array_replace 对嵌套数组只做一层替换:如果 $a['user'] 和 $b['user'] 都是数组,$b['user'] 会直接覆盖 $a['user'],不会合并子键。
而 array_merge_recursive 才会把同名子数组的键也合并下去。想实现“深层合并”,不能用 array_replace,也不能用普通 array_merge。
-
array_replace(['x'=>['a'=>1]], ['x'=>['b'=>2]])→['x'=>['b'=>2]](整个子数组被替换) - 需要合并子数组用
array_replace_recursive或自定义递归逻辑 -
array_merge遇到同名子数组也会直接覆盖,和array_replace在这点上行为相同
性能与兼容性:array_replace 更轻量,但 PHP 5.6+ 才可用
array_replace 是 PHP 5.6 引入的,比 array_merge(PHP 4 就有)晚很多。它内部不做数字键重排,函数调用开销略小,在处理大数组且含大量数字键时更高效。
但如果你的项目还要支持 PHP 5.5 或更早版本,就不能用 array_replace,得回退到 + 运算符或封装兼容函数。
- 现代项目(PHP 7.4+)推荐优先用
array_replace替代+,语义更清晰 -
+运算符不支持传入 null 或非数组类型,array_replace会抛TypeError,错误更明确 - 注意:所有三者都不修改原数组,返回新数组——这点容易被忽略,尤其在循环中反复赋值时



















