php 8.0中+运算符保留左数组键值、忽略右数组同名键,array_merge()则字符串键后覆盖、数字键强制重排;选择取决于是否需保留原始键结构或接受覆盖与重编号。

PHP 8.0 中合并数组时,键名冲突的处理逻辑取决于你用的是 + 还是 array_merge()——它们的覆盖优先级完全相反,不是“谁在前谁生效”的统一规则,而是由操作语义决定的。
+ 运算符:左侧键值永远保留,右侧同键被忽略
这是“数组联合”(array union),不是加法。它按左操作数为基准,只把右侧**不存在的键**加进来,已存在的键(无论数字还是字符串)一律不替换、不重排、不覆盖。
- 字符串键冲突:如
$a = ['id'=>1]; $b = ['id'=>999]; $a + $b→['id'=>1] - 数字键冲突:如
$a = [0=>'x']; $b = [0=>'y', 1=>'z']; $a + $b→[0=>'x', 1=>'z'](0来自左边,1是新增) - 不会重索引,也不会报错,行为稳定可预测
array_merge():字符串键后覆盖,数字键强制重排并追加
这是“顺序拼接+覆盖”,语义是“把后面数组的内容叠加到前面”,但对不同键类型区别对待:
- 字符串键冲突:后出现的值覆盖前一个,如
['a'=>1] + ['a'=>2]用array_merge()得['a'=>2] - 数字键冲突:不覆盖,而是全部重编号为连续整数,从
0开始。哪怕原数组是[5=>'x', 10=>'y'],合并后也会变成[0=>'x', 1=>'y'] - 注意:只要数组里存在任意数字键(哪怕只有一个是 int 类型),整个数字键部分都会被重排
关键对比场景示例
假设:
$a = ['name'=>'Alice', 0=>'first'];<br>$b = ['name'=>'Bob', 0=>'second', 'age'=>30];
-
$a + $b→['name'=>'Alice', 0=>'first', 'age'=>30](name和0全部保留左侧) -
array_merge($a, $b)→['name'=>'Bob', 0=>'first', 1=>'second', 'age'=>30](name被覆盖,数字键重排为0,1)
该选哪个?看你要什么
- 想保留原始键结构、避免重编号、且希望“已有值不动,只补缺项”→ 用
+ - 想按顺序整合数据、接受数字键重排、且需要后配置覆盖前配置(比如配置合并)→ 用
array_merge() - 要递归合并嵌套关联键(如
['user'=>['name']]和['user'=>['age']]合成完整 user)→ 改用array_merge_recursive()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











