array_merge 不能直接合并二维数组,需用 array_merge(...$a)(PHP 5.6+)或 call_user_func_array('array_merge', $a) 实现扁平化;前者要求子数组为纯数值索引,后者兼容旧版;递归函数不推荐用于二维场景。

array_merge 不能直接合并多维数组——它只接受多个**独立数组作为参数**,而不是一个包含子数组的二维数组变量。你传 array_merge($a)(其中 $a 是二维数组),PHP 会把它当作「一个参数」处理,结果就是原样返回 $a,不是扁平化。
真正能动态合并二维数组(如 [[1,2], [3,4], [5]] → [1,2,3,4,5])的,只有两种可靠方式,取决于你的 PHP 版本和子数组结构。
用 array_merge(...$a)(PHP 5.6+,推荐)
这是最干净的写法,依赖展开运算符(splat operator)把二维数组的每个子数组“解包”成独立参数:
$a = [[1, 2], [3, 4], [5]]; $result = array_merge(...$a); // 得到 [1, 2, 3, 4, 5]
- 要求所有子数组必须是**纯数值索引数组**(即
array(0=>x, 1=>y)),否则array_merge会按键名合并,导致顺序错乱或覆盖 - 如果某个子数组为空(
[]),不影响结果,会被安全忽略 - 不支持关联键的子数组:例如
[['a'=>1], ['b'=>2]]会变成['a'=>1, 'b'=>2],不是你想要的扁平值列表
用 call_user_func_array('array_merge', $a)(兼容 PHP
这是展开运算符的等价替代,在老环境(如 PHP 5.3–5.5)中必须用它:
$result = call_user_func_array('array_merge', $a);
- 行为与
array_merge(...$a)完全一致,只是写法更冗长 - 同样要求子数组为数值索引;若含字符串键,合并逻辑不变,但结果可能不符合预期(比如键名被保留、值被追加而非覆盖)
- 注意:不要写成
call_user_func_array(array_merge, $a)——array_merge必须加引号,否则 PHP 会尝试立即执行
别踩 array_merge_recursive 的坑
这个函数名字带“recursive”,容易误以为能扁平化,其实它干的是另一件事:对相同键名做递归合并,不是展平。
- 输入
[[1,2], [3,4]],输出仍是[[1,2], [3,4]](因为外层数组键是 0 和 1,不相同,不递归) - 输入
['data' => [1,2], 'data' => [3,4]],输出才是['data' => [1,2,3,4]] - 如果你的目标是“把所有值拉成一串”,它完全不适用
为什么不用自定义递归函数?
网上有些教程教写 my_array_merge() 或用 array_walk_recursive,看似通用,实际有隐藏问题:
立即学习“PHP免费学习笔记(深入)”;
-
array_walk_recursive会跳过空数组、丢失原始索引信息,且无法控制合并顺序(尤其含混合键时) - 手写递归函数容易在空子数组、非数组元素(如
null、字符串)、引用循环上出错 - 性能比原生
array_merge差不少,尤其数据量大时
除非你要处理真正嵌套深度 > 2 的结构(如三维数组),否则二维扁平化场景,坚持用 array_merge(...$a) 或 call_user_func_array 就够了——简单、快、可预测。



















