array_merge() 重排数字键并后写入优先覆盖字符串键,+ 运算符保留左侧数字键且先写入锁定字符串键;二者均不处理嵌套,深层合并需用 array_replace_recursive()。

array_merge() 遇到数字键会重排,不是“拼接”而是“重建索引”
只要任一输入数组含数字键(哪怕只是 [10, 20] 这种隐式 0/1 键),array_merge() 就会丢弃所有原始数字键,从 0 开始连续编号。这不是 bug,是设计行为。
- 常见错误现象:
$a = [0 => 'x']; $b = [0 => 'y']; array_merge($a, $b)→[0 => 'x', 1 => 'y'],你以为是覆盖,其实是追加+重排 - 使用场景:适合纯索引数组拼接,或你明确需要扁平化、重编号(比如合并多个
get_results()返回的数值索引结果集) - 容易踩的坑:混用数字键和字符串键时,
'x'键可能被当成数字(如['0' => 'a', 'x' => 'b']中'0'会被转为整型 0,干扰重排逻辑)
+ 运算符不重排、不覆盖,只“保留左侧已存在键”
+ 不是加法,是左优先联合操作:相同字符串键,左侧值胜出;相同数字键,右侧直接跳过——它连“覆盖”都不算,是彻底忽略。
- 常见错误现象:
$a = ['id' => 1, 0 => 'first']; $b = ['id' => 999, 0 => 'second', 1 => 'third']; $a + $b→['id' => 1, 0 => 'first', 1 => 'third'],'id'没被改,0没被换,1是新增的 - 使用场景:配置默认值注入(
$defaults + $user_input)、表单数据补全(保留用户填了的字段,只加缺失的默认项) - 性能影响:比
array_merge()轻量,但仅限两个数组;$a + $b + $c等价于($a + $b) + $c,仍只保最左一层
字符串键冲突时,array_merge() 和 + 的行为本质相反
同名字符串键下,array_merge() 是“后写入优先”,+ 是“先写入锁定”——这点极易混淆,尤其在写配置合并逻辑时。
-
array_merge(['a' => 1], ['a' => 2])→['a' => 2] -
(['a' => 1] + ['a' => 2])→['a' => 1] - 关键区别:
array_merge($defaults, $overrides)适合“以 overrides 为准”;$defaults + $overrides适合“以 defaults 为准,只填空” - 容易踩的坑:把
+当成“安全版 array_merge()”用,结果该覆盖的没覆盖(比如 API 响应中必须用用户传的status覆盖默认值,却误用了+)
嵌套数组别硬扛,该用 array_replace_recursive() 就别省事
array_merge() 和 + 都只处理顶层键。遇到 ['user' => ['name' => 'A']] 和 ['user' => ['age' => 25]] 这类结构,强行用它们会丢数据或覆盖整层。
-
array_merge($a, $b)→['user' => ['age' => 25]](后者整层覆盖前者) -
$a + $b→['user' => ['name' => 'A']](前者整层锁定,后者被忽略) - 正确解法:
array_replace_recursive($a, $b)→['user' => ['name' => 'A', 'age' => 25]] - 注意点:
array_replace_recursive()对非数组值不递归,比如['x' => 1]和['x' => ['y' => 2]]合并后'x'会变成[1, ['y' => 2]](自动包裹)
var_dump(array_keys($arr)) 看清键的真实类型。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











