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日

相关文章

  • PostgreSQL树形结构的递归查询示例

    下面我将详细讲解如何实现PostgreSQL树形结构的递归查询。 创建样例数据表 首先,我们需要创建一个样例数据表来演示如何进行递归查询。表结构如下: CREATE TABLE category( id SERIAL PRIMARY KEY, name TEXT NOT NULL, parent_id INTEGER REFERENCES category(…

    other 2023年6月27日
    00
  • PHP基于新浪IP库获取IP详细地址的方法

    PHP基于新浪IP库获取IP详细地址的方法攻略 简介 在PHP中,我们可以使用新浪IP库来获取IP地址的详细信息,包括国家、省份、城市、运营商等。这个方法可以帮助我们实现IP地址的定位功能。 步骤 1. 下载新浪IP库文件 首先,我们需要下载新浪IP库文件。你可以在新浪官方网站上找到这个文件并下载。确保你下载的是最新版本的IP库文件。 2. 导入IP库文件 …

    other 2023年7月30日
    00
  • Android学习之Fragment

    Android 学习之 Fragment 本文将介绍 Android Fragment 的基本概念、使用方法以及常见的一些问题和解决方法。 什么是 Fragment? Fragment 是 Android 提供的一种 UI 组件,可以理解为一个子 Activity,它可以被添加到 Activity 中,每个 Fragment 有自己的生命周期。在 Activ…

    other 2023年6月27日
    00
  • html提示信息的样式

    HTML提示信息的样式 在网站开发中,常常需要向用户提供一些重要信息,例如错误提示、警告、成功提示等。那么如何用 HTML 语言来呈现这些提示信息呢?本文将介绍几种常用的 HTML 提示信息样式。 1. 普通文本 最简单的提示信息样式就是普通文本,例如: <p>请注意:提交前请检查输入内容是否正确。</p> 这种方式非常简单,但缺点是…

    其他 2023年3月28日
    00
  • java简单读取properties配置文件的方法示例

    下面是关于“java简单读取properties配置文件的方法示例”的完整攻略: 什么是properties文件 在Java开发中,properties文件是一种常用的配置文件,通常用于存储一些应用程序运行时需要用到的配置信息,比如数据库连接信息、日志输出等等。properties文件是以键值对的形式存储数据,其中键和值之间以等号“=”分隔,每一行表示一个键…

    other 2023年6月25日
    00
  • rqalpha环境搭建(windows版)

    RQAlpha环境搭建(Windows版) RQAlpha是一款Python下基于Python3的开源量化交易研究框架。相较于其他的Python量化框架,RQAlpha具有开源、便捷、高效和易用等优点。在Windows系统下,RQAlpha的环境搭建需要涉及到Python环境配置、RQAlpha安装以及TA-Lib安装等步骤。下文将逐一介绍Windows系统…

    其他 2023年3月28日
    00
  • sqlcipher.exe提取码

    当然,我很乐意为您提供sqlcipher.exe提取码的完整攻略。以下是详细的步骤和示例: 步骤1:了解sqlcipher.exe提取 sqlcipher.exe提取是用于解密SQLite数据库的工具。它可以通过命令行方式运行,提取码解密加密的数据库文件。 步骤2下载sqlcipher.exe提取码 您可以从sqlcipher官网下载sqlcipher.ex…

    other 2023年5月6日
    00
  • 简析Win8下虚拟内存的必要性

    简析Win8下虚拟内存的必要性攻略 什么是虚拟内存? 虚拟内存是计算机操作系统中的一种技术,它允许将硬盘空间用作内存的扩展,以便处理大量的数据和程序。在Windows 8操作系统中,虚拟内存的设置对于系统的性能和稳定性至关重要。 为什么需要虚拟内存? 扩展内存容量:虚拟内存允许系统使用硬盘空间作为额外的内存,从而扩展了计算机的可用内存容量。这对于那些需要同时…

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