如何递归遍历任意深度的树形数组并提取结构化节点数据

浅丽吖_9139

浅丽吖_9139

2026-05-20

813人浏览

原创

如何递归遍历任意深度的树形数组并提取结构化节点数据

本文介绍如何高效遍历未知嵌套深度的树状数组,精准提取每个含 id/name/is_master/master_id 的节点块,并汇总为结构化数组以便批量入库。

本文介绍如何高效遍历未知嵌套深度的树状数组,精准提取每个含 id/name/is_master/master_id 的节点块,并汇总为结构化数组以便批量入库。

在处理组织架构、菜单树或权限节点等业务场景时,后端常接收深度不确定的嵌套数组(如 nodes 递归嵌套)。若直接使用简单递归遍历(如逐层 echo 值),无法按节点单元聚合关键字段;而我们需要的是:对每个具备完整业务属性(id, name, is_master, master_id)的子数组,独立提取并构造成标准化数据块,最终形成可批量插入数据库的二维数组。

✅ 核心思路:递归 + 结构校验 + 累积收集

不依赖固定层级路径(如 $arr['data'][0]['nodes'][1]),而是通过递归遍历所有元素,在每一层判断当前数组是否满足“有效节点”条件——即同时存在 id、name、is_master 和 master_id 四个键。满足则提取,否则继续向下递归。

以下是推荐的健壮实现:

function extractTreeNodes($arr, $result = []) {
    // 非数组类型直接跳过
    if (!is_array($arr)) {
        return $result;
    }

    // 检查是否为有效节点:包含全部四个必需字段
    if (
        isset($arr['id']) &&
        isset($arr['name']) &&
        isset($arr['is_master']) &&
        isset($arr['master_id'])
    ) {
        // 提取并追加到结果集(注意:保留原始值,不做强制类型转换)
        $result[] = [
            'id'        => $arr['id'],
            'name'      => $arr['name'],
            'is_master' => $arr['is_master'], // 可能为 null/empty/string,按需处理
            'master_id' => $arr['master_id']
        ];
    }

    // 递归遍历所有子项(兼容 'nodes'、'data'、数字索引等任意键名)
    foreach ($arr as $item) {
        if (is_array($item)) {
            $result = extractTreeNodes($item, $result);
        }
    }

    return $result;
}

// 使用示例
$rawTree = [
    'data' => [
        [
            'id' => '0ea8a4ab99694ce7b74f08ed7fc4602e',
            'name' => '部门A',
            'is_master' => '',
            'master_id' => 'ce93cab80820446290f7ea627578e6e9',
            'has_children' => 1,
            'nodes' => [
                [
                    'id' => '431169710c83410d841ab3cce079a0fd',
                    'name' => '小组A1',
                    'is_master' => '',
                    'master_id' => '0ea8a4ab99694ce7b74f08ed7fc4602e',
                    'has_children' => 0,
                    'nodes' => []
                ]
            ]
        ]
    ]
];

$nodes = extractTreeNodes($rawTree);
print_r($nodes);

⚠️ 注意事项与最佳实践

  • 字段容错性:isset() 检查比 array_key_exists() 更轻量,且能排除 null 值干扰;若业务允许 is_master 为 null,此逻辑依然安全。
  • 避免重复提取:本方案仅在当前层级数组本身满足四字段条件时才采集,不会因子数组同名字段误触发(例如 nodes 数组本身不含 id,不会被当作节点)。
  • 性能优化:对于超大深度树,可考虑迭代式 DFS(栈模拟)替代递归,防止 PHP 默认 xdebug.max_nesting_level 限制;但常规业务中递归更清晰易维护。
  • 入库前建议:
    • 对 name 做 trim() 和长度校验;
    • 将空字符串 '' 的 is_master 统一转为 null 或布尔 false;
    • 使用 PDO 批量插入(INSERT INTO ... VALUES (...), (...))提升写入效率。

✅ 总结

该方法解耦了树结构的具体键名(如 data/nodes),专注语义化识别“有效节点”,兼具灵活性与鲁棒性。返回的 $nodes 是标准二维关联数组,可直接用于 foreach 批量插入、JSON 序列化传输,或进一步映射为 Eloquent 模型集合。掌握此模式,即可从容应对各类动态嵌套数据解析需求。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11924

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6841

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2195

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4348

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5054

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3971

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5737

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4502

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12382

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习