php合并索引数组首选array_merge(),它拼接数组并重排为连续0-based索引;+运算符不重排且同键值被忽略;需保留原始索引时可用foreach或array_push(...$arr2);多维数组慎用array_merge_recursive(),其对数字键仍追加而非层级合并。

用 array_merge() 是最直接的方式
PHP 合并两个索引数组,首选 array_merge()。它会把第二个数组追加到第一个后面,并自动重排数字键(即索引),生成连续的 0-based 序列。
常见错误是误以为它会“保留原索引”或“按位置相加”,其实它只是拼接+重索引。
- 如果两个数组都有数字键,
array_merge()不会覆盖,而是顺延索引:array_merge([1,2], [3,4])→[1,2,3,4] - 若手动用
+运算符(如$a + $b),数字键不会重排,且后者同键值会被忽略——这通常不是你想要的合并效果 - 注意:传入非数组参数会触发警告,建议合并前用
is_array()检查
需要保留原始索引时用 array_values() 配合 +
极少数场景下,你希望保留第一个数组的索引,只把第二个数组“挂”在后面、不重排也不覆盖——这时不能用 array_merge(),得手动处理。
但要注意:+ 对数字键是“左优先”,[0=>1, 1=>2] + [0=>3, 1=>4] 结果仍是 [0=>1, 1=>2],第二个数组完全失效。
- 真正保留原始索引的拼接,得先用
array_values()把第二个数组转成纯索引形式,再用array_merge()——但这又回到重排了 - 如果硬要“不重排+不丢数据”,只能用
foreach循环推入:foreach ($arr2 as $v) $arr1[] = $v; -
array_push($arr1, ...$arr2)在 PHP 7.4+ 可行,但要求$arr2是一维且支持展开;PHP 8.0+ 更稳
合并多维索引数组时 array_merge_recursive() 的行为要小心
如果两个数组里嵌套了子数组,array_merge() 会直接替换(对数字键仍重排,但子数组被整个覆盖);而 array_merge_recursive() 会递归合并同键内容。
但它对数字键依然“重排+追加”,不是按层级合并——这点常被误解。
-
array_merge_recursive([['a']], [['b']])→[0=>['a'], 1=>['b']],不是[['a','b']] - 想实现子数组元素级合并(如把所有内层数组合并成一个),得自己写循环或用
array_reduce()+array_merge() - 注意:
array_merge_recursive()遇到字符串键会合并,遇到数字键仍当新元素处理,逻辑不统一
性能与兼容性提醒
小数组(array_merge() 完全没问题;大数组频繁合并要考虑内存和耗时——每次调用都创建新数组,旧数组等待 GC。
- PHP 7.4+ 推荐用展开语法:
[...$a, ...$b],语义清晰、性能略优,但仅限一维索引数组 - PHP 8.1+ 支持
array_merge(...$arrays)动态展开,适合不确定数量的数组合并 - 避免在循环里反复
array_merge()累加,改用foreach+[]追加更省内存
数字索引数组合并看似简单,但重索引规则、运算符歧义、多维处理这几个点,实际写错的概率比想象中高。动手前先确认:你要的是“拼起来重编号”,还是“拼起来不碰编号”,抑或是“每个子数组也得合并元素”。选错函数,后面调试花的时间远超多打几行字。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











