“后者覆盖前者”指array_merge()合并数组时,后数组的同名字符串键值无条件替换前数组对应键值,数字键则追加并重编号;如$a=['status'=>'pending']、$b=['status'=>'done'],结果中status为'done'。

字符串键冲突时“后者覆盖前者”指什么
当两个数组都有相同的字符串键(比如都叫 "name" 或 "id"),用 array_merge() 合并时,后出现的那个数组里该键对应的值,会直接替换掉前面数组中同名键的值。
这不是“合并”,而是“替换”
它不会把两个值拼在一起,也不会报错或跳过,而是无条件用后面的值顶替前面的。例如:
代码示例:
$a = ['status' => 'pending', 'user' => 'Alice'];
$b = ['status' => 'done', 'role' => 'admin'];
$result = array_merge($a, $b);
结果是:
Array ( ['status' => 'done', 'user' => 'Alice', 'role' => 'admin'] )
注意:'status' 的值从 'pending' 变成了 'done',因为 $b 在后面,它的 'status' 覆盖了 $a 的。
只对字符串键生效,数字键不这样处理
这个“覆盖”规则只适用于字符串键。数字键(如 0、1、2)不会被覆盖,而是全部追加,并且自动重编号为 0、1、2、3……
立即学习“PHP免费学习笔记(深入)”;
- 如果 $a = [0 => 'x', 1 => 'y'],$b = [0 => 'z', 1 => 'w'],合并后不是 [0=>'x', 1=>'y'] 或 [0=>'z', 1=>'w']
- 而是 [0=>'x', 1=>'y', 2=>'z', 3=>'w'] —— 所有值都保留,只是键被重新整理
想保留前面的值?换方法
如果你希望相同字符串键时,优先用第一个数组的值(比如配置默认值,只让后面数组补充缺失项),就不能用 array_merge(),而应该选:
- + 运算符:左侧键值永远保留,右侧同键被忽略
- array_replace():只替换已有键,不添加新键,也不重排数字键
- 手动遍历 + isset() 判断:完全自定义逻辑



















