array_merge重排数字键并覆盖字符串键,+运算符保留左侧键且仅追加右侧新键;数字索引时前者连续重排、后者保持原键;关联数组时前者后项覆盖、后者左优先不覆盖。

array_merge 和 加号(+)运算符 都能合并 PHP 数组,但行为截然不同——关键在键的处理方式:前者重排数字键、覆盖字符串键;后者保留左侧键值、仅右侧未出现的键才追加。
数字索引数组:键会重排 vs 键保持原样
当数组以数字为下标(如 [0 => 'a', 1 => 'b'])时:
-
array_merge($a, $b)会把所有元素重新索引为连续数字,从 0 开始。即使 $b 本身有 [2=>'c', 3=>'d'],合并后仍是 [0=>'a', 1=>'b', 2=>'c', 3=>'d']。 -
$a + $b则完全保留 $a 的数字键,只把 $b 中“键在 $a 中不存在”的元素加进来。若 $a 是 [0=>'a', 1=>'b'],$b 是 [0=>'x', 2=>'c'],结果是 [0=>'a', 1=>'b', 2=>'c'] —— $b 的 0 被忽略,2 被保留。
关联数组(字符串键):覆盖 vs 保留左侧
对键名为字符串的数组(如 ['name' => 'Tom', 'age' => 25]):
-
array_merge会用右侧数组同名键的值直接覆盖左侧(后写者胜)。array_merge(['a'=>1, 'b'=>2], ['b'=>3, 'c'=>4])得到['a'=>1, 'b'=>3, 'c'=>4]。 -
+运算符则坚持“左优先”:只保留左侧已有的键,右侧同名键被彻底忽略。['a'=>1, 'b'=>2] + ['b'=>3, 'c'=>4]结果是['a'=>1, 'b'=>2, 'c'=>4]—— 'b' 没被替换,'c' 被补上。
混合数组:行为一致但逻辑更易混淆
含数字键和字符串键的数组,两者规则仍分别适用:
立即学习“PHP免费学习笔记(深入)”;
-
array_merge对数字键重排,对字符串键覆盖; -
+对所有键(无论数字或字符串)都执行“左侧存在即跳过”,不重排、不覆盖、不合并。 - 例如:
[0=>'x', 'id'=>1] + [0=>'y', 'id'=>2, 'name'=>'Lily']→[0=>'x', 'id'=>1, 'name'=>'Lily'];而array_merge([0=>'x', 'id'=>1], [0=>'y', 'id'=>2, 'name'=>'Lily'])→[0=>'x', 1=>'y', 'id'=>2, 'name'=>'Lily']。
实际使用建议
选哪个,取决于你要什么效果:
- 想拼接列表、重置索引、允许后项覆盖配置项 → 用
array_merge; - 想做“默认值填充”(左侧是默认,右侧是用户自定义,只补充不修改已有项)→ 用
+; - 注意:
+不支持非数组操作,会报错;array_merge会把非数组参数转为空数组再合并; - PHP 7.4+ 可考虑
array_merge_recursive或...展开合并,但基础场景中二者仍是主力。
理解键的归属逻辑,比记住语法更重要。多数配置合并、数据补全场景,+ 更安全;需要真正融合、重编号或覆盖时,array_merge 更合适。










