用+运算符、预分配数组、扩展运算符或splfixedarray可显著提升大数组合并性能,避免array_merge的线性开销。

直接用 array_merge 合并几十万元素的数组,性能会断崖式下跌——不是 PHP 写得烂,是它内部必须逐个复制、重排数字键、做类型检查,开销随元素数线性增长。真要提速,得绕过它的通用逻辑。
用 + 运算符跳过重索引和键冲突处理
当所有待合并数组都是关联数组(或全是纯数字索引且你**不 care 索引连续性**),+ 是最快的一招。它不做任何键值重排,也不遍历右侧数组去覆盖同名字符串键,只做浅层内存拷贝。
- 左侧数组的键和值全保留,右侧同名键(无论字符串还是数字)直接被忽略
- 若数组含纯数字键(如
[0=>'a', 1=>'b']),+不会把它们“拼”成[0=>'a', 1=>'b', 2=>'c'],而是保留左侧已有索引,只追加右侧未出现的索引 - 写法简单:
$result = $arr1 + $arr2 + $arr3;,但注意:不能用于混合键类型(比如一个带字符串键、一个带数字键)的数组,否则行为不可控
预分配数组 + 手动填充避免动态扩容
如果你明确知道各数组长度,且最终需要严格连续的数字索引(比如喂给 json_encode 或数据库批量插入),预分配比 array_merge 少掉至少 30% 的内存重分配成本。
- 先用
count()算总长,再用array_fill(0, $total, null)创建目标数组 - 用偏移量变量(如
$offset = 0)控制写入位置,遍历每个源数组时直接赋值:$result[$offset++] = $val; - 最后调用一次
array_values($result)—— 只在必须返回紧凑索引时才做,别每轮都调
PHP 7.2+ 直接用扩展运算符 ... 解包
这是语法最干净、性能接近 + 的方案,但要求 PHP ≥ 7.2 且所有数组结构一致(不能混用字符串键和数字键)。
- 写法:
$result = [...$arr1, ...$arr2, ...$arr3]; - 它展开的是值本身,不重排索引;对关联数组会保留键,对数字数组会展开为新索引(从 0 开始递增)
- 注意:如果
$arr1是['a'=>1, 'b'=>2],$arr2是[3,4],那么[...$arr1, ...$arr2]结果是['a'=>1, 'b'=>2, 0=>3, 1=>4]—— 键类型混合时行为明确,但得自己心里有数
SplFixedArray 用于超大纯数字索引场景
当你要合并的全是数值型数据(比如日志 ID 列表、传感器采样点),且总数固定、不频繁增删,SplFixedArray 能压低内存占用 40% 以上,访问速度也更快。
- 初始化:
$fixed = new SplFixedArray($totalSize); - 手动按索引写入:
$fixed[$index] = $value;,不能用字符串键 - 最后转回普通数组仅在必要时调用:
$fixed->toArray();,否则一直用SplFixedArray对象操作 - 坑点:它不支持动态扩容,
count()返回的是容量而非实际元素数,得自己维护计数器
真正卡住性能的,往往不是选错函数,而是没意识到 array_merge 的重索引动作在大数据量下有多重——尤其当你合并的是从数据库查出的二维结果集时,每个子数组的数字键都会被反复打乱重建。提前决定要不要索引、要不要保留键名,比事后优化更有效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











