PHP实现无限级分类(不使用递归)

下面我会详细讲解如何使用 PHP 实现无限级分类,并且不使用递归的方式。

什么是无限级分类

无限级分类是指分类与分类之间存在父子关系,每个分类下都可以包含多个子分类,而每个子分类又可以包含多个子分类,以此类推,可以无限延伸下去的分类体系。它在很多网站的分类功能中都有使用,比如商品分类、文章分类等。

不使用递归的无限极分类实现

  1. 从数据库中获取所有分类的数据。
$sql = "SELECT * FROM categories";
$result = mysqli_query($conn, $sql);
$categories = [];
while ($row = mysqli_fetch_assoc($result)) {
    $categories[] = $row;
}
  1. 遍历分类数据,将所有分类数据按照父子关系存储到一个数组中。
$tree = [];
foreach ($categories as $category) {
    if ($category['parent_id'] == 0) {
        $tree[$category['id']] = $category;
    } else {
        $tree[$category['parent_id']]['children'][] = $category;
    }
}

在这里,我们使用了一个 $tree 数组来存储分类数据,数组中的元素的父子关系对应着分类数据的父子关系,根据上例,我们最终希望的 $tree 数组结构应如下:

[
    1 => [
        'id' => 1,
        'name' => '顶级分类1',
        'parent_id' => 0,
        'children' => [
            [
                'id' => 2,
                'name' => '子分类1-1',
                'parent_id' => 1,
            ],
            [
                'id' => 3,
                'name' => '子分类1-2',
                'parent_id' => 1,
                'children' => [
                    [
                        'id' => 4,
                        'name' => '子分类1-2-1',
                        'parent_id' => 3,
                        'children' => [
                            [
                                'id' => 5,
                                'name' => '子分类1-2-1-1',
                                'parent_id' => 4,
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ],
    6 => [
        'id' => 6,
        'name' => '顶级分类2',
        'parent_id' => 0,
    ]
]
  1. 遍历 $tree 数组,将分类数据格式化为具有层级关系的 HTML 结构。
function buildMenuHtml(array $tree, int $level = 0): string
{
    $html = '';
    foreach ($tree as $node) {
        $html .= '<li>' . $node['name'];
        if (isset($node['children'])) {
            $html .= '<ul>' . buildMenuHtml($node['children'], $level + 1) . '</ul>';
        }
        $html .= '</li>';
    }
    return $html;
}

$menuHtml = '<ul>' . buildMenuHtml($tree) . '</ul>';
echo $menuHtml;

在这里,我们使用了一个 buildMenuHtml 函数,该函数接受一个 $tree 数组以及一个可选的 $level 参数(默认值为 0),$level 参数用于确定当前分类所处的层级。函数最终返回一个包含层级关系的 HTML 结构。

示例:

假设网站后台分类管理界面中需要展示一个层级关系的分类树,我们可以使用上面的代码来生成 HTML 标签,然后将其插入到 DOM 中,最终呈现出一个分类树的形式,方便管理员进行分类管理。

又如,如果我们是一个电商平台,其中有一个商品分类页面,需要展示所有的商品分类,我们可以使用上面的代码生成 HTML 标签,然后插入到模板中,最终呈现出一个包含层级关系的商品分类的页面。

以上就是使用 PHP 实现无限级分类,并且不使用递归的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现无限级分类(不使用递归) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Rundll32.exe是什么?Rundll32.exe出现错误怎么办?如何解决?

    Rundll32.exe是什么? Rundll32.exe是Windows操作系统中的一个重要系统进程。它是一个可执行文件,用于加载和执行DLL(动态链接库)文件中的函数。DLL文件包含了许多可供其他程序调用的函数,而Rundll32.exe充当了这些函数的中间人。 Rundll32.exe的主要作用是允许其他程序在不加载整个DLL的情况下调用DLL中的特定…

    other 2023年7月28日
    00
  • java获取文件扩展名的方法小结【正则与字符串截取】

    Java获取文件扩展名的方法小结【正则与字符串截取】 在Java中,获取文件扩展名的方法有多种。本文将介绍两种常用的方法:正则表达式和字符串截取。 方法一:正则表达式 使用正则表达式可以方便地从文件名中提取出扩展名。下面是一个示例代码: import java.util.regex.Matcher; import java.util.regex.Patter…

    other 2023年8月6日
    00
  • ajax异步请求302分析

    Ajax异步请求302分析 在前端开发中,我们经常需要通过ajax异步请求数据,但有时候我们可能会遇到一些坑,如出现302重定向等问题,接下来我们就来分析一下ajax异步请求中可能出现的302问题。 什么是302? 302表示请求的资源已经临时转移到了另一个URI,这个URI可以在响应的Location字段中找到。我们可以理解为访问的网页已经被暂时移动到了其…

    其他 2023年3月28日
    00
  • Mybatis Properties 配置优先级详解

    Mybatis Properties 配置优先级详解 1. 介绍 Mybatis 是一款优秀的持久层框架,广泛应用于 Java 开发中。在使用 Mybatis 进行开发时,我们可以通过配置 Properties 文件来设置框架的各种行为和属性。本攻略将详细讲解 Mybatis Properties 配置的优先级。 2. Properties 配置的优先级 M…

    other 2023年6月28日
    00
  • vue监听scroll的坑的解决方法

    标题:Vue监听scroll的坑的解决方法 问题背景 在Vue的开发中,经常需要监听scroll事件以实现一些滚动相关的交互效果。但是,在使用Vue绑定scroll事件时,会出现一些坑。 问题描述 在Vue中通过v-on指令绑定scroll事件之后,发现绑定的函数并没有被触发,示例代码如下: <template> <div class=&q…

    other 2023年6月27日
    00
  • stringbuilder去除最后一个多余的字符的方法

    StringBuilder去除最后一个多余的字符的方法 在开发过程中,我们经常会需要拼接字符串。但是拼接完成之后,由于一些原因,最后一个字符可能变成了多余的字符。这个时候,就需要使用StringBuilder类来去除这个多余字符了。 StringBuilder类简介 StringBuilder是Java API中用于处理字符串的类,与String类不同的是,…

    其他 2023年3月29日
    00
  • WinRAR将一大堆有顺序的压缩包恢复成一个大文件的技巧

    当我们将一个大文件分割成多个小的有序压缩包时,如果要将这些压缩包恢复成原来的大文件,我们就需要使用WinRAR提供的相关功能。 以下是将一大堆有序压缩包恢复成一个大文件的具体步骤: 1. 打开WinRAR并定位到第一个压缩包 首先需要打开WinRAR程序,然后找到第一个压缩包。确保已将所有压缩包下载完毕并全部存放在同一个文件夹内。 例子:假设我们下载了一个名…

    other 2023年6月26日
    00
  • 【wireshark】插件开发(五):c插件

    wireshark插件开发(五): c插件 在本系列的前几篇文章中,我们讨论了Wireshark插件的开发以及Python和Lua编写插件的方法。在本文中,我们将进一步讨论Wireshark插件开发,并学习如何使用C语言编写Wireshark插件。 C插件 C语言是Wireshark的默认开发语言,并提供了最广泛的插件API。C插件可以访问Wireshark…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部