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免费学习笔记(深入)”;
- 它跳过键名,不保留原始结构信息,也不处理数组类型的叶子(如含数组的 Closure 或对象不会被递归)
- 需配合闭包收集值,不能直接返回新数组,需预先定义容器
示例:
$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)仅适用于二维,且要求子数组键为数字才不覆盖











