PHP中+运算符合并数组时右侧同键值被丢弃是设计行为而非bug,即数组联合:保留左侧键,跳过右侧已存在的字符串或数字键,不覆盖不报错。

PHP 用 + 运算符合并数组时,键冲突下右侧值被丢弃,不是“bug”,而是设计行为——它叫数组联合(Array Union),本质是保留左侧键,跳过右侧已存在的键,不是覆盖,也不是报错。
为什么字符串键冲突时右侧值被丢弃
因为 + 的语义是“把右侧数组中左侧没有的键加进来”。只要左侧已有某个字符串键(比如 'name'),右侧同名键的值就直接忽略,不参与合并。
$a = ['name' => 'Alice', 'age' => 25];$b = ['name' => 'Bob', 'city' => 'Beijing'];-
$result = $a + $b;→['name' => 'Alice', 'age' => 25, 'city' => 'Beijing']
这里 'name' => 'Bob' 被丢弃,不是因为它“弱”,而是 + 从不执行覆盖逻辑。
为什么数字键冲突时右侧值也被丢弃
注意:这里的“数字键”指显式定义的整数索引(如 0、1),不是自动推导的。当左右数组都有相同数字键(例如都含 0),+ 会保留左侧的 0 值,右侧的 0 完全跳过,不会重排也不会追加。
立即学习“PHP免费学习笔记(深入)”;
$a = [0 => 'first', 1 => 'second'];$b = [0 => 'replaced', 1 => 'ignored', 2 => 'new'];-
$result = $a + $b;→[0 => 'first', 1 => 'second', 2 => 'new']
右侧的 0 和 1 因键已存在被跳过,只有 2 是新键,才被加入。
和 array_merge() 的关键区别在哪
很多人混淆,是因为 array_merge() 对字符串键是“后覆盖前”,而 + 是“前保留、后丢弃”。对数字键,array_merge() 会重编号并拼接,+ 则严格按键存在与否做取舍。
- 要以左侧为默认配置、右侧只补缺 → 用
+ - 要用右侧值覆盖同名配置项 → 用
array_merge()或array_replace() - 要合并多维结构且不破坏嵌套 → 用
array_replace_recursive()
小提醒:+ 不支持三个及以上数组直接链式写
写 $a + $b + $c 在语法上合法,但实际是 ($a + $b) + $c,仍只保证最左边数组的键优先。如果想让多个数组都“以第一个为准”,没问题;但如果希望中间某个数组的键也参与优先判定,就得换思路,比如循环 + 或改用 array_replace()。



















