PHP 5.6 及更早版本不支持 array_merge(...$arr),应改用 call_user_func_array('array_merge', $arr) 或 array_reduce($arr, 'array_merge', []),并注意过滤非数组元素。

PHP 5.6 及更早版本不支持 array_merge(...$arr) 展开语法
PHP 5.6 引入了参数展开(splat)操作符 ...,但 PHP 5.3–5.5 中直接写 array_merge(...$arr) 会报 Parse error: syntax error, unexpected '.'。这是二维转一维时最常踩的坑——把新语法当通用方案用。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确认目标环境 PHP 版本:用
phpversion()检查,别只看文档示例 - PHP 5.5 及以下必须避免
...,改用call_user_func_array('array_merge', $arr) - 注意
call_user_func_array在 PHP 7+ 中性能略低于...,但兼容性无问题 - 若
$arr为空数组,call_user_func_array会返回NULL,需提前判断:empty($arr) ? [] : call_user_func_array('array_merge', $arr)
array_reduce 是 PHP 5.3+ 全版本安全的降维写法
array_reduce 不依赖新语法,且逻辑清晰,适合需要控制合并行为(如去重、过滤空子数组)的场景。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 基础二维转一维:
array_reduce($arr, 'array_merge', []) - 若子数组含非数组值(如
null或字符串),array_merge会警告,应先过滤:array_reduce(array_filter($arr, 'is_array'), 'array_merge', []) - PHP 5.3 支持闭包,但若需最大兼容(如 PHP 5.2),用命名函数代替匿名函数
- 性能上比
call_user_func_array略低,但差异在千行级数据内可忽略
遇到 array_merge(): Argument #1 is not an array 怎么办
这个错误常见于子数组中混入了非数组类型(比如数据库查询结果里某字段为 null 或 false),而 array_merge 要求所有参数都是数组。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 不要简单用
(array)$item强转——它会把null变成空数组,但把字符串变成[0 => 'str'],可能引发意料外结构 - 稳妥做法是显式过滤:
array_reduce(array_filter($arr, function($v) { return is_array($v); }), 'array_merge', []) - 若需保留非数组值并转为单元素数组,用
array_map预处理:array_map(function($v) { return is_array($v) ? $v : [$v]; }, $arr),再进array_merge或array_reduce
嵌套深度不确定时,别硬写递归兼容 PHP 5
题目说“二维转一维”,但实际代码里可能传入三维甚至更深结构。强行用 foreach 套多层循环不仅难维护,还容易漏掉边界情况(如空数组、稀疏索引)。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 明确需求:真要“完全扁平化”还是仅“降一层”?多数业务场景只需降一层,用前述
array_reduce或call_user_func_array即可 - 若确实需无限扁平,PHP 5.3+ 可用递归函数,但注意避免栈溢出——加深度限制或改用栈模拟迭代
- 别为了兼容旧版 PHP 把简单问题复杂化;先确认真实嵌套结构,再选方案
真正麻烦的不是语法差异,而是没想清楚:你手里的二维数组,到底是不是真的“二维”——中间有没有 null、false、字符串混入,才是运行时报错的主因。











