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

花韻仙語
发布: 2025-10-11 09:37:27
原创
821人浏览过

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 数组。

使用示例

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

即构数智人
即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36
查看详情 即构数智人
$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速学教程(入门到精通)
PHP速学教程(入门到精通)

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

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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