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

yizhihongxing

下面是详细讲解“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日

相关文章

  • 动物园之星闪退怎么办 游戏崩溃闪退问题解决方法

    动物园之星闪退及崩溃解决方法攻略 动物园之星是一款家庭娱乐休闲游戏,但有些玩家反馈在游戏过程中遇到闪退及崩溃的问题。本文将详细介绍动物园之星闪退及崩溃的原因及解决方法,帮助玩家在游戏中获得更好的体验。 原因分析 动物园之星闪退及崩溃可能是由以下原因导致的: 网络不稳定或无网络环境,会导致游戏闪退; 手机存储空间不足,会导致游戏卡顿或闪退; 手机系统版本过低或…

    other 2023年6月27日
    00
  • java的四种引用——强弱软虚

    Java的四种引用——强弱软虚 Java中的内存管理是一个关键问题,为了更好地利用内存资源,Java引入了垃圾回收机制,但是垃圾回收并不意味着内存就完全不需要管理了。Java中有四种引用类型,分别是强引用,弱引用,软引用和虚引用,这四种引用类型分别有不同的使用场景和生命周期,是Java内存管理的重要组成部分。 强引用 强引用是Java中默认的引用类型,如果存…

    其他 2023年3月28日
    00
  • 关于PHP中Object对象的笔记分享

    关于PHP中Object对象的笔记分享 1. 什么是PHP中的Object对象? 在PHP中,Object对象是指通过类实例化的对象。它是一个可以存储数据和方法的实体,可以根据其类的定义进行操作和访问。 2. 如何创建Object对象? 要创建一个Object对象,首先需要定义一个类。类是对象的模板,描述了对象的属性和方法。下面是一个示例的类定义: clas…

    other 2023年6月28日
    00
  • spring boot 即时重新启动(热更替)使用说明

    以下是关于如何在Spring Boot项目中实现即时重新启动(热更替)的完整攻略。 1. 添加Spring Boot的devtools依赖 首先,在pom.xml文件中添加devtools依赖,如下所示: <dependencies> <!– 添加DevTools依赖 –> <dependency> <group…

    other 2023年6月27日
    00
  • Android账号注册实现点击获取验证码倒计时效果

    Android账号注册实现点击获取验证码倒计时效果攻略 1. 概述 在Android应用中实现点击获取验证码倒计时效果,可以提高用户体验和安全性。本攻略将详细介绍如何实现这一功能。 2. 实现步骤 2.1 布局文件 首先,在布局文件中添加一个按钮和一个倒计时文本框,用于显示倒计时的时间。 <Button android:id=\"@+id/b…

    other 2023年8月26日
    00
  • C语言switch 语句的用法详解

    C语言switch语句的用法详解 什么是switch语句? switch语句是一种用于对变量或表达式进行多路分支的语句,它会根据指定的表达式的值来执行相应的语句代码块。 switch语句通常被用于与if语句类似的场合,但是switch语句通常更加简洁明了。其基本格式如下: switch(expression) { case constant1: /* sta…

    other 2023年6月27日
    00
  • 微软公布Win10正式版服务生命周期为十年:2025年结束

    背景 微软公司在2015年7月29日发布了Windows 10操作系统,成为继Windows 8之后的新一代Windows系统。但是,像所有的Windows系统一样,Win10也有其服务生命周期。在2021年1月14日,微软公司官方宣布Win10的正式版服务生命周期为十年,将于2025年1月结束。这意味着Win10在2025年1月14日之后,将不再享受微软公…

    other 2023年6月27日
    00
  • 关于python:如何将十六进制字符串转换为十六进制数

    以下是关于“如何将十六进制字符串转换为十六进制数”的完整攻略,包括基本知识和两个示例。 基本知识 在Python中,可以使用int()函数将十六进制字符串转换为十六进制数。int()的第一个参数是要转换的字符串,第二个参数是要转换的字符串的进制。例如,将十六进制字符串”0x1″转换为十六进制数,可以以下代码: num = int("0x1a&quo…

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