php多维数组拍平是将嵌套数组转为一维的过程,核心为递归遍历:遇子数组则递归,否则追加;可用自定义递归函数或array_walk_recursive实现,高级需求可保留路径键名,需注意递归深度、循环引用及性能优化。

PHP 多维数组拍平(即“降维”或“扁平化”)是指将嵌套多层的数组(如二维、三维甚至更深)转换为一维数组的过程。核心在于递归遍历每个元素,遇到子数组就继续展开,非数组元素则直接追加到结果中。
基础递归实现(支持任意深度)
最直观的方式是使用递归函数,逐层判断并合并:
- 定义函数接收一个数组参数和一个引用的结果数组
- 遍历输入数组,对每个值用
is_array()判断是否为数组 - 是数组则递归调用自身;否则直接
[]追加到结果中
示例代码:
function flattenArray($arr, &$result = []) { foreach ($arr as $item) { if (is_array($item)) { flattenArray($item, $result); } else { $result[] = $item; } } return $result; } // 使用:flattenArray([1, [2, [3, 4]], 5]); // 返回 [1,2,3,4,5]
使用 array_walk_recursive(简洁内置方案)
PHP 内置函数 array_walk_recursive() 会自动深入所有层级访问非数组值,适合“只取叶子节点”的场景:
立即学习“PHP免费学习笔记(深入)”;
示例:
$result = []; array_walk_recursive($arr, function($value) use (&$result) { $result[] = $value; });
保留键名与路径的高级拍平(可选需求)
若需区分来源(比如调试或反向映射),可记录完整路径作为新键名:
- 递归时传入当前路径(如
['user', 'profile', 'tags']) - 拼接为字符串键,例如
'user.profile.tags.0' - 适用于配置解析、表单数据标准化等场景
关键逻辑:遇到数组就递进,遇到值就用 implode('.', $path) 生成键。
性能与边界注意点
实际使用中需留意:
- 超深嵌套可能触发 PHP 递归限制(默认约 100 层),可用
set recursion_limit调整(不推荐盲目提高) - 含循环引用的数组会导致无限递归,应先用
spl_object_hash或引用跟踪做检测 - 大数组建议用迭代替代递归(如栈模拟),避免栈溢出
-
array_merge(...$arrays)仅适用于二维,且要求子数组键为数字才不覆盖