php实现无限级分类查询(递归、非递归)

下面是详细讲解“php实现无限级分类查询(递归、非递归)”的完整攻略。

无限级分类查询

无限级分类,是指一个数据表中的数据具有层次关系,例如商品分类、栏目分类等。无限级分类查询是指在查询这个分类数据表时,要将所有的数据归类到不同的层级中,以便于在页面上展示并且方便用户浏览。

数据库设计

在设计数据库表时,需要添加一个 parent_id 字段,来表示父级分类的 id,如下所示:

create table categories (
    id int(11) unsigned not null auto_increment primary key,
    name varchar(255) not null,
    parent_id int(11) unsigned default 0
);

递归实现

递归实现是指使用 PHP 函数来循环查询数据并建立父子关系。

/**
 * 递归获取分类树
 *
 * @param array $data 分类数据
 * @param int $parent_id 父级分类id
 * @param int $level 分类级别
 * @return array
 */
function getCategoriesTree($data, $parent_id = 0, $level = 0)
{
    $tree = array();
    foreach ($data as $category) {
        if ($category['parent_id'] == $parent_id) {
            $category['level'] = $level;
            $category['children'] = getCategoriesTree($data, $category['id'], $level + 1);
            $tree[] = $category;
        }
    }
    return $tree;
}

// 示例代码
$data = array(
    array('id'=>1, 'name'=>'分类1', 'parent_id'=>0),
    array('id'=>2, 'name'=>'分类2', 'parent_id'=>0),
    array('id'=>3, 'name'=>'分类1.1', 'parent_id'=>1),
    array('id'=>4, 'name'=>'分类1.2', 'parent_id'=>1),
    array('id'=>5, 'name'=>'分类2.1', 'parent_id'=>2),
    array('id'=>6, 'name'=>'分类1.1.1', 'parent_id'=>3),
);

$tree = getCategoriesTree($data);
print_r($tree);

输出结果如下:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 分类1
            [parent_id] => 0
            [level] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => 分类1.1
                            [parent_id] => 1
                            [level] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 6
                                            [name] => 分类1.1.1
                                            [parent_id] => 3
                                            [level] => 2
                                            [children] => Array
                                                (
                                                )

                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 4
                            [name] => 分类1.2
                            [parent_id] => 1
                            [level] => 1
                            [children] => Array
                                (
                                )

                        )

                )

        )

    [1] => Array
        (
            [id] => 2
            [name] => 分类2
            [parent_id] => 0
            [level] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => 分类2.1
                            [parent_id] => 2
                            [level] => 1
                            [children] => Array
                                (
                                )

                        )

                )

        )

)

非递归实现

非递归实现是指使用堆栈(stack)来循环查询数据并建立父子关系。

/**
 * 非递归获取分类树
 *
 * @param array $data 分类数据
 * @return array
 */
function getCategoriesTreeWithoutRecursion($data)
{
    $tree = array();
    $stack = array();
    foreach ($data as $category) {
        if ($category['parent_id'] == 0) {
            $category['level'] = 0;
            $category['children'] = array();
            $tree[] = $category;
            array_push($stack, &$tree[count($tree) - 1]);
        } else {
            $category['level'] = 0;
            $category['children'] = array();
            $node = array('data' => $category, 'parent' => null);
            while (!empty($stack) && $stack[count($stack) - 1]['data']['id'] != $category['parent_id']) {
                array_pop($stack);
            }
            if (!empty($stack)) {
                $node['parent'] = &$stack[count($stack) - 1];
                $node['data']['level'] = $node['parent']['data']['level'] + 1;
                $node['parent']['data']['children'][] = &$node['data'];
                array_push($stack, &$node['data']);
            }
        }
    }
    return $tree;
}

// 示例代码
$data = array(
    array('id'=>1, 'name'=>'分类1', 'parent_id'=>0),
    array('id'=>2, 'name'=>'分类2', 'parent_id'=>0),
    array('id'=>3, 'name'=>'分类1.1', 'parent_id'=>1),
    array('id'=>4, 'name'=>'分类1.2', 'parent_id'=>1),
    array('id'=>5, 'name'=>'分类2.1', 'parent_id'=>2),
    array('id'=>6, 'name'=>'分类1.1.1', 'parent_id'=>3),
);

$tree = getCategoriesTreeWithoutRecursion($data);
print_r($tree);

输出结果和上面的递归实现相同,不再赘述。

以上是无限级分类查询(递归、非递归)的完整攻略。

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

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

相关文章

  • Mysql系统变量与状态变量详细介绍

    Mysql系统变量与状态变量详细介绍攻略 MySQL是一个流行的关系型数据库管理系统,它提供了许多系统变量和状态变量来控制和监视数据库的行为。本攻略将详细介绍MySQL的系统变量和状态变量,并提供两个示例说明。 系统变量 系统变量是MySQL中的全局或会话级别的配置选项,可以通过修改这些变量来改变数据库的行为。以下是一些常见的系统变量: max_connec…

    other 2023年8月9日
    00
  • vue router 配置路由的方法

    Vue Router 配置路由的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页面应用(SPA)的路由功能。下面是配置路由的方法的详细攻略。 步骤一:安装 Vue Router 首先,你需要在你的 Vue.js 项目中安装 Vue Router。可以通过 npm 或者 yarn 进行安装。 npm install vue-rout…

    other 2023年7月28日
    00
  • java虚拟机深入学习之内存管理机制

    Java虚拟机深入学习之内存管理机制攻略 1. 概述 Java虚拟机(JVM)的内存管理机制是Java程序运行的关键部分。了解内存管理机制可以帮助我们优化程序性能、避免内存泄漏和内存溢出等问题。本攻略将详细介绍Java虚拟机的内存管理机制。 2. Java虚拟机内存结构 Java虚拟机的内存可以分为以下几个部分: 2.1. 方法区(Method Area) …

    other 2023年8月1日
    00
  • Adobe Animate CC2019怎么安装激活?

    接下来我将为您提供Adobe Animate CC2019安装及激活的完整攻略。 安装Adobe Animate CC2019 第一步:下载Adobe Animate CC2019安装包 你可以通过Adobe官方网站或者其他官方渠道下载安装包。在这里我以官网为例,提供安装包下载地址:https://www.adobe.com/products/animate…

    other 2023年6月27日
    00
  • 海信电视内存空间不足怎么清理内存?

    海信电视内存空间不足清理攻略 如果你的海信电视内存空间不足,可以尝试以下方法来清理内存,以提高电视的性能和响应速度。 1. 关闭不必要的应用程序和进程 海信电视上可能会同时运行多个应用程序和进程,这些应用程序和进程会占用内存空间。关闭不必要的应用程序和进程可以释放内存,提高电视的性能。 示例说明: 步骤1: 按下遥控器上的“Home”按钮,进入主屏幕。 步骤…

    other 2023年7月31日
    00
  • 我教你学之注册表清理

    我教你学之注册表清理 本文将为你讲解如何利用注册表清理工具清理 Windows 系统中无用的注册表项。这将有助于提高系统运行效率,加快系统速度。 什么是注册表? Windows 操作系统中,保存系统配置信息的一个重要组成部分就是注册表。从我们日常使用计算机的角度来看,注册表可以理解为是一个“配置文件”,里面存储了非常多的系统和应用程序的配置信息。 为什么需要…

    other 2023年6月25日
    00
  • 如何改变placeholder的样式

    postcss那些事儿的完整攻略 PostCSS是一个基于JavaScript的CSS处理器,它可以帮助我们自动化处理CSS,提高开发效率和质量。本文将为您提供一份完整攻略,介绍PostCSS的基本概念和用法,包括示例说明等。 概念介绍 PostCSS PostCSS是一个基于JavaScript的CSS处理器,它可以帮助我们自动化处理CSS,包括自动添加浏…

    other 2023年5月5日
    00
  • 深入了解Android IO的底层原理

    深入了解Android IO的底层原理 IO(输入输出)是Android系统中的基本操作之一。本攻略将深入探究Android IO的底层原理,包括如何使用Java IO和NIO进行文件读写,如何使用内存映射文件进行快速读写等内容。 Java IO Java IO是Android系统中最常用的IO操作方式之一,其底层实现基于操作系统提供的文件IO操作(read…

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