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

yizhihongxing

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

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

{
    "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使用explode()函数将字符串拆分成数组的方法

    当我们需要将一个字符串按照特定的字符或者字符串进行拆分时,PHP的内置函数explode()可以很好的满足我们的需求。下面是介绍如何使用explode()函数将字符串拆分成数组的完整攻略。 1. 函数定义 explode()函数用于将一个字符串分割成数组。其语法为: array explode ( string $delimiter , string $st…

    PHP 2023年5月26日
    00
  • ASP.NET文件上传控件Uploadify的使用方法

    下面我将为您详细讲解“ASP.NET文件上传控件Uploadify的使用方法”的完整攻略。 使用Uploadify控件上传文件 1. 准备工作 在使用Uploadify控件之前,需要下载相关的资源文件,包括JQuery库、Uploadify插件和SWF文件等。这些文件可以在Uploadify的官网上进行下载。 在下载完成后,将这些文件放置在项目的指定目录中,…

    PHP 2023年5月27日
    00
  • php 上一篇,下一篇文章实现代码与原理说明

    我来详细讲解一下“PHP 上一篇、下一篇文章实现代码与原理说明”的完整攻略。 什么是上一篇、下一篇文章 “上一篇、下一篇文章”通常用于博客或新闻等页面。它们是两个链接,用于实现文章之间的导航。当用户访问当前文章时,可以通过这两个链接直接访问上一篇文章或下一篇文章,提高了网站的内容可浏览性和用户体验。 实现上一篇、下一篇文章的原理 实现上一篇、下一篇文章需要从…

    PHP 2023年5月23日
    00
  • PHP 实现页面静态化的几种方法

    PHP 实现页面静态化的几种方法包括以下几种: 1. 静态文件生成 在 PHP 中,我们可以使用 ob_start() 和 ob_get_contents() 函数缓存动态生成的页面,然后将缓存中的内容写入一个静态文件中。当访问该页面时,优先访问静态文件,如果不存在则再动态生成。这样可以减少服务器压力,提高页面访问速度。 示例代码: <?php ob_…

    PHP 2023年5月27日
    00
  • PHP实现将颜色hex值转换成rgb的方法

    有关于将颜色hex值转换成rgb的方法,可以使用PHP内置函数 hex2rgb() 来实现。 具体实现请按照以下步骤: 步骤一、获取输入 获取用户输入,即需要转换的颜色hex值,可以使用 $_GET 或者 $_POST 方式获取,这里以 $_GET 方法为例,示例如下: $hex_color = $_GET[‘color’]; 步骤二、转换hex值 将颜色h…

    PHP 2023年5月26日
    00
  • Typecho插件实现添加文章目录的方法详解

    下面是“Typecho插件实现添加文章目录的方法详解”的完整使用攻略,包括插件描述、插件分析、插件使用和两个示例。 插件描述 Typecho是一款轻量级的PHP博客程序,它具有简单、易用、高效等特点。在Typecho中我们可以使用插件来扩展其功能。本篇攻略将介绍一款Typecho插件,它可以实现在文章中添加目录的功能。 插件分析 以下是该插件的分析: 插件名…

    PHP 2023年5月12日
    00
  • 基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解

    基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解 简介: 在PHP开发中,字符串的比较操作是非常常见的操作。为了满足不同需求,PHP代码库中提供了多条字符串比较函数,其中最基础的是strcmp()和strcasecmp()函数。本文将详细介绍这两个函数的使用方法。 strcmp()函数 定义 strcmp()函数是PHP中的字符…

    PHP 2023年5月26日
    00
  • php数组转换js数组操作及json_encode的用法详解

    下面我来详细讲解“php数组转换js数组操作及json_encode的用法详解”的完整攻略。 简介 在Web开发中,php作为服务器端语言经常与js进行交互。而php数组转换js数组则是常见的一种操作,它可以把php中的数组转换为js中的数组,使得前后端数据传递更加便捷。而json_encode则是将php数组转换为JSON字符串的函数,也是实现php数组转…

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