0

0

PHP 数组转换:构建树形结构数据

花韻仙語

花韻仙語

发布时间:2025-10-11 09:37:27

|

839人浏览过

|

来源于php中文网

原创

php 数组转换:构建树形结构数据

本文介绍如何使用 PHP 将扁平化的数组数据转换为树形结构,特别适用于具有父子关系的数据。通过递归函数,我们可以高效地将具有 id 和 parent_id 字段的数组转换为多维数组,清晰地表示数据的层级关系,并提供完整的示例代码和详细的步骤说明。

构建树形结构的 PHP 函数

将扁平数组转换为树形结构的核心在于识别父子关系并进行递归构建。以下是一个 PHP 函数,可以实现这个功能:

function buildTree(array $elements, ?int $parentId = null): array
{
    $branch = [];
    foreach ($elements as $element) {
        if ($element['parent_id'] === $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

这个 buildTree 函数接收两个参数:

  • $elements: 待转换的扁平数组。数组中的每个元素都应该包含 id 和 parent_id 字段。
  • $parentId: 当前要查找的父节点的 ID。 默认为 null,表示查找根节点。

函数内部的逻辑如下:

立即学习PHP免费学习笔记(深入)”;

  1. 初始化一个空数组 $branch,用于存放当前层级的树节点。
  2. 遍历 $elements 数组,查找 parent_id 等于当前 $parentId 的元素。
  3. 如果找到匹配的元素,则递归调用 buildTree 函数,查找该元素的子节点。
  4. 如果存在子节点,则将子节点添加到当前元素的 children 属性中。
  5. 将当前元素添加到 $branch 数组中。
  6. 返回 $branch 数组。

使用示例

假设我们有以下扁平数组:

W78CMS企业网站管理系统 (中英繁三语版)1.0 build 100724
W78CMS企业网站管理系统 (中英繁三语版)1.0 build 100724

程序采用ASP+ACCESS开发完成。中英繁三语言,所有页面采用UTF-8全球通用编码,兼容简体中文、繁体中文及英语,适用于中小企业网站运用。后台数据同时录入中文及英文,繁体采用JS自动转换,无需维护。免费版主要功能如下:·系统管理:系统综合设置、管理员管理、数据库备份、上传文件管理。·单页管理:自由无限制添加个性页面,如:公司简介、组织结构、联系我们等

下载
$array = [
    ['id'=> 1, 'parent_id' => '-', 'name' => 'id1'],
    ['id' => 2, 'parent_id' => 1, 'name'=> 'id2'],
    ['id' => 3, 'parent_id' => 1, 'name'=> 'id3'],
    ['id' => 4, 'parent_id' => '-', 'name'=> 'id4'],
    ['id' => 5,'parent_id' => 2, 'name'=> 'id5'],
    ['id' => 6, 'parent_id' => 3, 'name'=> 'id6'],
    ['id' => 7, 'parent_id' => '-', 'name'=> 'id7'],
    ['id' => 8, 'parent_id' => 3, 'name'=> 'id8'],
    ['id' => 9, 'parent_id' => 4, 'name'=> 'id9'],
    ['id' => 10, 'parent_id' => 9, 'name'=> 'id10'],
];

注意,这里的根节点的 parent_id 设置为 '-',你可以根据实际情况调整。 为了方便处理,我们需要先找到所有的根节点,然后分别构建它们的子树。

$tree = [];
foreach ($array as $element) {
    if ($element['parent_id'] === '-') {
        $tree[] = [
            'id' => $element['id'],
            'name' => $element['name'],
            'children' => buildTree($array, $element['id']),
        ];
    }
}

这段代码首先遍历 $array 数组,找到所有 parent_id 为 '-' 的元素,这些元素就是根节点。 然后,对于每个根节点,调用 buildTree 函数构建以该节点为根的子树,并将结果添加到 $tree 数组中。

结果展示

使用 print_r 函数打印 $tree 数组,可以看到如下的树形结构:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => id1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [parent_id] => 1
                            [name] => id2
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 5
                                            [parent_id] => 2
                                            [name] => id5
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 3
                            [parent_id] => 1
                            [name] => id3
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 6
                                            [parent_id] => 3
                                            [name] => id6
                                        )

                                    [1] => Array
                                        (
                                            [id] => 8
                                            [parent_id] => 3
                                            [name] => id8
                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 4
            [name] => id4
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 9
                            [parent_id] => 4
                            [name] => id9
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 10
                                            [parent_id] => 9
                                            [name] => id10
                                        )

                                )

                        )

                )

        )

    [2] => Array
        (
            [id] => 7
            [name] => id7
            [children] => Array
                (
                )

        )

)

这个结果清晰地展示了数组的树形结构,每个节点都有 id、name 和 children 属性。children 属性包含了该节点的所有子节点,如果该节点没有子节点,则 children 属性为空数组。

注意事项

  • 循环引用: 如果数组中存在循环引用(例如,A 的 parent_id 是 B,B 的 parent_id 是 A),则递归函数可能会陷入无限循环。 在实际应用中,需要避免出现循环引用。
  • 性能: 对于大型数组,递归构建树形结构可能会比较耗时。 可以考虑使用迭代的方式来优化性能。
  • 根节点标识: 根节点的 parent_id 可以根据实际情况进行调整,例如设置为 null、0 或其他特殊值。
  • 数据验证: 在构建树形结构之前,应该对输入数据进行验证,确保 id 和 parent_id 字段存在且类型正确。

总结

本文介绍了如何使用 PHP 将扁平化的数组数据转换为树形结构。通过递归函数,我们可以高效地构建多维数组,清晰地表示数据的层级关系。 在实际应用中,需要注意循环引用、性能优化和数据验证等问题。 通过灵活运用这些技巧,可以更好地处理具有父子关系的数据,提高代码的可读性和可维护性。

相关专题

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

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

1958

2023.09.01

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

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

1282

2023.10.11

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

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

1191

2023.10.11

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

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

948

2023.10.23

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

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

1400

2023.10.23

html怎么上传
html怎么上传

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

1229

2023.11.03

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

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

1439

2023.11.09

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

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

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

2

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号