PHP 7.4前可用call_user_func_array('array_merge', $a)、array_reduce($a, 'array_merge', [])或循环累加实现二维数组展平,三者均兼容PHP 5.3+,分别侧重兼容性、简洁性与可控性。

PHP 7.4 之前不支持展开运算符(...$array),所以无法直接写 array_merge(...$a)。但要动态合并一个二维数组(如 [[1,2], [3,4], [5]])为一维,仍有几种稳定、兼容的替代方案,关键看你的 PHP 版本和数组结构。
用 call_user_func_array() 调用 array_merge
这是最通用、最接近展开运算符语义的写法,兼容 PHP 5.3+ 所有版本:
$a = [[1, 2], [3, 4], [5]];
$result = call_user_func_array('array_merge', $a);
// 输出: [1, 2, 3, 4, 5]
- ✅ 支持任意数量的子数组(哪怕 100 个)
- ✅ 子数组必须是索引数组(数字键),否则字符串键会被重置
- ⚠️ 若
$a为空数组[],call_user_func_array('array_merge', [])在 PHP expects at least 1 parameter
→ 需提前判断:$result = !empty($a) ? call_user_func_array('array_merge', $a) : [];
用循环 + array_merge() 累加
适合对逻辑控制要求高,或需跳过空/非法子数组的场景:
$a = [[1, 2], [], [3, 4], [5]];
$result = [];
foreach ($a as $sub) {
if (is_array($sub)) {
$result = array_merge($result, $sub);
}
}
// 输出: [1, 2, 3, 4, 5]
- ✅ 自动跳过非数组项或空数组,健壮性好
- ✅ 不依赖函数参数数量限制,无版本兼容问题
- ❌ 性能略低(每次
array_merge都新建数组,O(n²) 时间复杂度)
用 array_reduce() 函数式写法(PHP 5.3+)
更简洁,语义清晰,适合习惯函数式风格的开发者:
$a = [[1, 2], [3, 4], [5]]; $result = array_reduce($a, 'array_merge', []); // 输出: [1, 2, 3, 4, 5]
- ✅ 自动处理空数组(初始值设为
[]即可) - ✅ 一行解决,代码密度高
- ⚠️ 注意:
array_reduce的回调必须接收两个参数(累计值 + 当前项),array_merge恰好符合,所以可直接传函数名
不推荐的写法
-
字符串拼接 +
eval():安全隐患大,性能差,已被淘汰 -
手动列参数(如
array_merge($a[0], $a[1], $a[2])):不可扩展,维护困难,违背动态需求初衷 -
+运算符:只合并顶层键,不展平数组,完全不适用此场景
只要子数组都是纯数值索引、不需要递归扁平化,上面三种方法任选其一即可。call_user_func_array 是历史最久、最贴近原生语义的方案;array_reduce 更现代简洁;循环方式最易理解和调试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











