PHP 多维数组拍平算法实现

4次阅读

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

PHP 多维数组拍平算法实现

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) 仅适用于二维,且要求子数组键为数字才不覆盖

text=ZqhQzanResources