PHP合并数组元素总数变少主因是键名冲突导致覆盖或忽略:array_merge()覆盖同名字符串键,+运算符丢弃右侧重复键;数字键在array_merge()中重索引,在+中被忽略;还需排查null、array_unique()或unset()等干扰因素。

PHP合并数组后元素总数变少,通常不是“丢失”,而是键名冲突导致的覆盖或忽略——核心原因在于你用的方法没对上数据结构。
array_merge() 会覆盖同名字符串键
当两个数组都有相同的字符串键(比如 'name'、'status'),array_merge() 默认让后一个数组的值生效,前面的被覆盖。看起来像“少了一个”,其实是被替换了。
$a = ['name' => 'Alice', 'age' => 25];$b = ['name' => 'Bob', 'city' => 'Beijing'];$c = array_merge($a, $b); // 结果有 3 个元素:name='Bob', age=25, city='Beijing'
这里 'name' 键只保留一个值,不是删了,是覆盖了。
+ 运算符会忽略右侧重复的字符串键
用 + 合并时,逻辑相反:左侧数组的键值对全保留,右侧仅补充“左侧没有的键”。一旦键名重复,右侧的直接丢弃。
立即学习“PHP免费学习笔记(深入)”;
$x = ['id' => 100, 'type' => 'user'];$y = ['id' => 200, 'role' => 'admin'];$z = $x + $y; // 结果:id=100, type='user', role='admin' —— $y 的 id 被跳过了
所以如果你预期 4 个元素,实际只有 3 个,大概率是 字符串键重名 + 用了 + 运算符。
数字键行为不同,但容易误判总数
数字键(如 0、1)在 array_merge() 中会被重新索引,而 + 则保留原键并“并集式”叠加。看似都“加了”,但计数逻辑不同:
-
array_merge([1,2], [3,4]) → [1,2,3,4](4 个,索引 0–3) -
[0=>1, 1=>2] + [0=>3, 1=>4] → [0=>1, 1=>2](还是 2 个,右侧完全被忽略)
尤其当数组带“空洞”索引(如 [0=>'a', 2=>'c']),用 + 合并可能让你误以为漏了元素,其实只是没按顺序排。
检查是否混用了两种方式或含空/NULL元素
有时总数“变少”是假象:
- 某个数组本身含
null或空字符串,count()照常计数,但print_r()显示不明显; - 代码中先
array_merge()再用array_unique()却没留意去重逻辑; - 合并前有
unset()或引用赋值导致意外截断。
建议用 var_dump($arr) 查看完整结构,别只信 print_r() 或肉眼数行数。



















