array_replace按键覆盖、保留数字键,array_merge追加数字键并重排、字符串键后覆盖;前者容错强可传null,后者要求全为数组;二者均不递归,深层合并需用array_replace_recursive。

array_replace 和 array_merge 都能合并数组,但行为差异明显:前者按键替换,后者按索引追加;对关联数组和数字索引数组的处理逻辑完全不同。
替换逻辑 vs 合并逻辑
array_replace 会用后续数组的值,**覆盖前一个数组中相同键的值**,不改变原数组结构,未出现的键保留原值。array_merge 则是把后续数组“拼到后面”:数字键重排,字符串键被覆盖(后出现的生效)。
- array_replace(['a' => 1, 'b' => 2], ['b' => 3, 'c' => 4]) → ['a' => 1, 'b' => 3, 'c' => 4]
- array_merge(['a' => 1, 'b' => 2], ['b' => 3, 'c' => 4]) → ['a' => 1, 'b' => 3, 'c' => 4](结果看似一样,但机制不同)
数字索引数组表现截然不同
这是最易踩坑的地方。array_replace 把数字键当普通键处理,保持原有下标;array_merge 会重置数字键为连续整数。
- array_replace([10, 20], [30, 40]) → [30, 40](键 0→30,键 1→40,不新增)
- array_merge([10, 20], [30, 40]) → [10, 20, 30, 40](全部追加,键重排为 0,1,2,3)
- 若想保留数字键并覆盖,只能用 array_replace;若想扁平拼接,必须用 array_merge
空数组和 null 的处理方式
array_replace 允许传入 null 或非数组参数,会跳过;array_merge 要求所有参数都是数组,否则报 Warning。
立即学习“PHP免费学习笔记(深入)”;
- array_replace([1,2], null, ['a'=>3]) → [1,2,'a'=>3](null 被忽略)
- array_merge([1,2], null, ['a'=>3]) → PHP Warning: array_merge(): Expected parameter 2 to be an array
- 所以 array_replace 更适合动态参数场景,比如配置覆盖时不确定某些参数是否存在
嵌套数组不会递归处理
两者都只做**一层替换/合并**,深层结构完全不会递归。如果需要深度合并,得用 array_replace_recursive 或自定义函数。
- array_replace(['user'=>['name'=>'A']], ['user'=>['age'=>25]]) → ['user'=>['age'=>25]](整个 'user' 数组被替换)
- array_merge(['user'=>['name'=>'A']], ['user'=>['age'=>25]]) → ['user'=>['age'=>25]](同样被覆盖,不是合并子数组)
- 要得到 ['user'=>['name'=>'A','age'=>25]],必须用 array_replace_recursive











