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日

相关文章

  • C#读取文件MD5值的实现代码

    下面是C#读取文件MD5值的实现代码的完整攻略。 一、什么是MD5 MD5全称是Message-Digest Algorithm 5(信息摘要算法5),是一种单向加密算法。在数据传输和处理中常用于校验数据的完整性和一致性。 二、如何使用C#读取文件的MD5值 使用C#读取文件的MD5值需要使用System.Security.Cryptography命名空间中…

    PHP 2023年5月23日
    00
  • PHP输出缓冲与header发送问题详解

    PHP输出缓冲与header发送问题在Web开发中是一个很常见的问题。本文将详细讲解如何理解输出缓冲和header发送以及如何解决由此引发的问题。 什么是输出缓冲? 在PHP中,当代码向浏览器发送输出时,在输出内容到达浏览器之前,PHP会在内存中先暂存一段时间。这样做的原因是为了避免在输出数据较大的情况下重复使用write()代码。 当你使用echo、pri…

    PHP 2023年5月26日
    00
  • 使用fileReader的一个坑及解决

    调用fileReader对象的readAsText()方法读取文件内容时,有时会遇到编码问题,导致无法正常读取文件内容的情况。本文将详细讲解使用fileReader的一个坑及解决方法。 问题描述 当fileReader对象读取文件内容时,有时会遇到编码问题,导致无法正确读取文件内容。 示例1 var reader = new FileReader(); re…

    PHP 2023年5月27日
    00
  • PHP常见的序列化与反序列化操作实例分析

    PHP常见的序列化与反序列化操作实例分析 序列化是将对象或变量转化为一串可传输的字符串的过程,方便存储和传输数据。反序列化是将这个字符串还原成原始的对象或变量。在PHP中,我们使用serialize()函数进行序列化操作,使用unserialize()函数进行反序列化操作。 序列化操作示例 示例1:序列化一个数组 $data = array( "u…

    PHP 2023年5月26日
    00
  • 基于PHP实现用户注册登录功能

    下面是基于PHP实现用户注册登录功能的完整攻略: 1. 确定需求 在开始实现用户注册登录功能之前,首先需要明确应用程序的需求。通常包括以下几个方面: 用户能够在应用程序中注册新账户 已注册的用户能够使用账户登录应用程序 在用户登录后,能够显示相关的个人信息或操作选项 在用户注册或登录时,应用程序需要验证用户提供的凭据(比如账户名和密码等) 2. 数据库设计 …

    PHP 2023年5月27日
    00
  • php简单计算年龄的方法(周岁与虚岁)

    这里是使用PHP计算年龄的方法的攻略。通过该方法可以计算出某个人的周岁和虚岁。在此之前,我们需要掌握几个基本的数学和计算知识。 确定生日日期 在计算年龄时,首先需要确定某个人的出生日期。这可以通过不同的方式来获取,比如使用表单输入或从数据库中获取数据。在本文中,我们将使用字符串类型“YYYY-MM-DD”作为生日日期。 计算周岁 计算周岁非常简单,只需要当前…

    PHP 2023年5月26日
    00
  • PHP防注入安全代码

    关于“PHP防注入安全代码”的完整攻略,可以按照以下步骤进行: 1. 了解注入攻击的基本原理 注入攻击的原理是将恶意代码嵌入到用户输入的数据中,通过执行这些代码来实现攻击的目的。比如利用SQL注入攻击,攻击者可以在表单中输入一些恶意的SQL语句,从而获取敏感数据或者篡改数据。 2. 使用PDO或者mysqli扩展连接数据库 首先,我们要使用PDO或者mysq…

    PHP 2023年5月23日
    00
  • php读取文件内容的方法汇总

    下面是关于”php读取文件内容的方法汇总”的完整攻略。 标题 概述 在PHP中,我们通常需要读取文件内容来进行处理,比如读取日志文件、读取配置文件等等。本文将介绍PHP中读取文件内容的几种方法,让大家对此有一个清晰的了解。 fwrite函数 fwrite函数是PHP编程中常用的一个操作文件的函数,它可以用于向文件中写入数据,也可以用于读取文件内容。在读取文件…

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