PHP树的代码,可以嵌套任意层

首先,我们需要了解什么是树结构。树结构是一种非线性数据结构,由节点和边组成,节点之间存在层次关系。我们通常将树的最上方节点称为根节点,将没有子节点的节点称为叶子节点。

下面是一个简单的树状数据结构:

{
    "id": 1,
    "name": "Node 1",
    "children": [
        {
            "id": 2,
            "name": "Node 1.1",
            "children": [
                {
                    "id": 3,
                    "name": "Node 1.1.1",
                    "children": []
                },
                {
                    "id": 4,
                    "name": "Node 1.1.2",
                    "children": []
                }
            ]
        },
        {
            "id": 5,
            "name": "Node 1.2",
            "children": [
                {
                    "id": 6,
                    "name": "Node 1.2.1",
                    "children": []
                }
            ]
        }
    ]
}

要实现一个能嵌套任意层的PHP树代码,我们可以使用递归来将传入的数据转换成树状结构。下面是一个示例代码:

function buildTree($flat) {
    $grouped = array_reduce($flat, function($carry, $item) {
        $carry[$item['parent_id']][] = [
            'id' => $item['id'],
            'name' => $item['name'],
            'children' => []
        ];
        return $carry;
    }, []);

    $fnBuilder = function(&$node) use (&$fnBuilder, $grouped) {
        $node['children'] = isset($grouped[$node['id']])
            ? $grouped[$node['id']]
            : [];

        foreach ($node['children'] as &$child) {
            $fnBuilder($child);
        }
    };

    $tree = $grouped[null];

    foreach ($tree as &$node) {
        $fnBuilder($node);
    }

    return $tree;
}

这个示例代码接受一个类似下面的扁平化结构:

[
    ['id' => 1, 'name' => 'Node 1', 'parent_id' => null],
    ['id' => 2, 'name' => 'Node 1.1', 'parent_id' => 1],
    ['id' => 3, 'name' => 'Node 1.1.1', 'parent_id' => 2],
    ['id' => 4, 'name' => 'Node 1.1.2', 'parent_id' => 2],
    ['id' => 5, 'name' => 'Node 1.2', 'parent_id' => 1],
    ['id' => 6, 'name' => 'Node 1.2.1', 'parent_id' => 5],
]

如果我们将上面的示例数据传入buildTree函数,它将会返回一个树状结构,如下所示:

[
    [
        'id' => 1,
        'name' => 'Node 1',
        'children' => [
            [
                'id' => 2,
                'name' => 'Node 1.1',
                'children' => [
                    [
                        'id' => 3,
                        'name' => 'Node 1.1.1',
                        'children' => [],
                    ],
                    [
                        'id' => 4,
                        'name' => 'Node 1.1.2',
                        'children' => [],
                    ],
                ],
            ],
            [
                'id' => 5,
                'name' => 'Node 1.2',
                'children' => [
                    [
                        'id' => 6,
                        'name' => 'Node 1.2.1',
                        'children' => [],
                    ],
                ],
            ],
        ],
    ],
]

另一个示例代码是基于对象实现的树状结构。下面是示例代码:

class TreeNode {
    public $id;
    public $name;
    public $children;

    public function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
        $this->children = [];
    }

    public function addChild(TreeNode $node) {
        $this->children[] = $node;
    }
}

function buildTree($flat) {
    $grouped = array_reduce($flat, function($carry, $item) {
        $carry[$item['parent_id']][] = new TreeNode(
            $item['id'],
            $item['name']
        );
        return $carry;
    }, []);

    $fnBuilder = function($node) use (&$fnBuilder, $grouped) {
        $node->children = isset($grouped[$node->id])
            ? $grouped[$node->id]
            : [];

        foreach ($node->children as $child) {
            $fnBuilder($child);
        }
    };

    $tree = new TreeNode(null, '');
    $tree->children = $grouped[null];

    foreach ($tree->children as $node) {
        $fnBuilder($node);
    }

    return $tree->children;
}

此示例与前一个示例类似,但是使用了一个名为TreeNode的类来表示树节点。与前一个示例不同的是,这个函数返回的树节点本身而不是它们的属性(例如ID或名称)。

总的来说,要创建一个能嵌套任意层次的树结构,我们可以使用递归和循环两种方法。以上两个示例代码都是使用递归来生成嵌套树结构。如果使用循环,需要使用堆栈等数据结构才能实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP树的代码,可以嵌套任意层 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • php函数之子字符串替换 str_replace

    下面是关于PHP函数str_replace的详细讲解。 什么是str_replace str_replace是PHP中一种字符串替换的函数。它可以将源字符串中一部分子字符串匹配,并将其替换为新的子字符串。例如,如果你需要将一个字符串中的所有空格替换为下划线(_)号,你就可以使用str_replace函数。 str_replace的基本用法 str_repla…

    PHP 2023年5月26日
    00
  • 基于PHP实现原生增删改查的示例代码

    下面是详细的攻略: 基于PHP实现原生增删改查的示例代码 环境准备 PHP环境:需要安装PHP5.6及以上版本 数据库: 利用MySQL数据库来实现增删改查示例 数据库操作 连接数据库 在PHP里,连接MySQL数据库需要用到mysqli扩展。下面是连接MySQL示例代码: $db_host = ‘localhost’; $db_username = ‘ro…

    PHP 2023年5月24日
    00
  • php中配置文件保存修改操作 如config.php文件的读取修改等操作

    php读取config.php文件内容并输出 首先要明确config.php文件的格式,通常这种文件会以数组的方式保存配置信息。比如以下示例: $config = [ ‘db_host’ => ‘localhost’, ‘db_username’ => ‘root’, ‘db_password’ => ‘123456’, ‘db_name’…

    PHP 2023年5月26日
    00
  • PHP实现一维数组与二维数组去重功能示例

    当我们需要处理一组数据时,其中去重操作是非常常见的。在PHP中,可以使用array_unique函数实现一维数组去重,但是对于二维数组,我们需要写一些代码来实现去重操作。下面是实现一维数组与二维数组去重功能的攻略。 实现一维数组去重 在PHP中,我们可以使用array_unique函数实现一维数组的去重操作。下面是一个示例代码: $arr = array(1…

    PHP 2023年5月26日
    00
  • php中的常用魔术方法总结

    那么我来为你详细讲解“PHP中的常用魔术方法总结”的完整攻略。 什么是魔术方法 在PHP中,魔术方法(Magic Method)是一种特殊的方法,它们允许在对象执行某些特殊的操作时自动调用。魔术方法和普通方法最大的区别在于它们的调用时机不同,魔术方法是在特定的情况下自动调用的,而普通方法则需要在代码中显式调用。 常用的魔术方法 以下列出了PHP中常用的魔术方…

    PHP 2023年5月25日
    00
  • 浅析ThinkPHP的模板输出功能

    当我们使用ThinkPHP框架进行开发时,经常会用到模板输出功能。本文将对ThinkPHP的模板输出功能进行浅析。 什么是模板输出? 模板输出是指将经过处理后的数据以指定的格式输出到前端页面上。在ThinkPHP中,使用模板引擎来实现模板输出功能。 ThinkPHP中的模板引擎 ThinkPHP中提供了两种常用的模板引擎:原生PHP模板引擎和Smarty模板…

    PHP 2023年5月26日
    00
  • PHP中创建图像并绘制文字的例子

    下面是针对 “PHP中创建图像并绘制文字的例子” 的完整攻略。 准备工作 在 PHP 中创建图像并绘制文字需要使用到 GD 库,所以在开始之前,需要先确定是否已经安装了 GD 库。可以通过以下代码检查是否安装: if (function_exists(‘gd_info’)) { echo "GD library is installed"…

    PHP 2023年5月26日
    00
  • PHP的文件操作与算法实现的面试题示例

    关于“PHP的文件操作与算法实现的面试题示例”的完整攻略,可以进行如下介绍: 一、简介 PHP作为一门通用的编程语言,其被广泛应用于Web开发、命令行工具等领域,并在日趋发展。对于管理网站的开发者,文件操作与算法实现也是非常重要的技能点之一,因此这也是Web开发面试中经常被考察的问题之一。 二、PHP文件操作 在Web开发中,文件操作也是一个非常重要的环节,…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部