实现PHP+Mysql无限分类的方法汇总


Posted in PHP onMarch 02, 2015

无限分类是个老话题了,来看看PHP结合Mysql如何实现。

第一种方法

这种方法是很常见、很传统的一种,先看表结构

表:category
id int 主键,自增
name varchar 分类名称
pid int 父类id,默认0
顶级分类的 pid 默认就是0了。当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先讲所有分类取出来,保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率。

先来构建一个原始数组,这个直接从数据库中拉出来就行:

$categories = array(

    array('id'=>1,'name'=>'电脑','pid'=>0),

    array('id'=>2,'name'=>'手机','pid'=>0),

    array('id'=>3,'name'=>'笔记本','pid'=>1),

    array('id'=>4,'name'=>'台式机','pid'=>1),

    array('id'=>5,'name'=>'智能机','pid'=>2),

    array('id'=>6,'name'=>'功能机','pid'=>2),

    array('id'=>7,'name'=>'超级本','pid'=>3),

    array('id'=>8,'name'=>'游戏本','pid'=>3),

);

目标是将它转化为下面这种结构

电脑
    笔记本
        超级本
        游戏本
    台式机
手机
    智能机
    功能机
用数组来表示的话,可以增加一个 children 键来存储它的子分类:

array(

    //1对应id,方便直接读取

    1 => array(

        'id'=>1,

        'name'=>'电脑',

        'pid'=>0,

        children=>array(

            &array(

                'id'=>3,

                'name'=>'笔记本',

                'pid'=>1,

                'children'=>array(

                    //此处省略

                )

            ),

            &array(

                'id'=>4,

                'name'=>'台式机',

                'pid'=>1,

                'children'=>array(

                    //此处省略

                )

            ),

        )

    ),

    //其他分类省略

)

处理过程:

$tree = array();

//第一步,将分类id作为数组key,并创建children单元

foreach($categories as $category){

    $tree[$category['id']] = $category;

    $tree[$category['id']]['children'] = array();

}

//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。

foreach ($tree as $k=>$item) {

    if ($item['pid'] != 0) {

        $tree[$item['pid']]['children'][] = &$tree[$k];

    }

}

print_r($tree);

打印结果如下:

Array

(

    [1] => Array

        (

            [id] => 1

            [name] => 电脑

            [pid] => 0

            [children] => Array

                (

                    [0] => Array

                        (

                            [id] => 3

                            [name] => 笔记本

                            [pid] => 1

                            [children] => Array

                                (

                                    [0] => Array

                                        (

                                            [id] => 7

                                            [name] => 超级本

                                            [pid] => 3

                                            [children] => Array

                                                (

                                                )

                                        )

                                    [1] => Array

                                        (

                                            [id] => 8

                                            [name] => 游戏本

                                            [pid] => 3

                                            [children] => Array

                                                (

                                                )

                                        )

                                )

                        )

                    [1] => Array

                        (

                            [id] => 4

                            [name] => 台式机

                            [pid] => 1

                            [children] => Array

                                (

                                )

                        )

                )

        )

    [2] => Array

        (

            [id] => 2

            [name] => 手机

            [pid] => 0

            [children] => Array

                (

                    [0] => Array

                        (

                            [id] => 5

                            [name] => 智能机

                            [pid] => 2

                            [children] => Array

                                (

                                )

                        )

                    [1] => Array

                        (

                            [id] => 6

                            [name] => 功能机

                            [pid] => 2

                            [children] => Array

                                (

                                )

                        )

                )

        )

    [3] => Array

        (

            [id] => 3

            [name] => 笔记本

            [pid] => 1

            [children] => Array

                (

                    [0] => Array

                        (

                            [id] => 7

                            [name] => 超级本

                            [pid] => 3

                            [children] => Array

                                (

                                )

                        )

                    [1] => Array

                        (

                            [id] => 8

                            [name] => 游戏本

                            [pid] => 3

                            [children] => Array

                                (

                                )

                        )

                )

        )

    [4] => Array

        (

            [id] => 4

            [name] => 台式机

            [pid] => 1

            [children] => Array

                (

                )

        )

    [5] => Array

        (

            [id] => 5

            [name] => 智能机

            [pid] => 2

            [children] => Array

                (

                )

        )

    [6] => Array

        (

            [id] => 6

            [name] => 功能机

            [pid] => 2

            [children] => Array

                (

                )

        )

    [7] => Array

        (

            [id] => 7

            [name] => 超级本

            [pid] => 3

            [children] => Array

                (

                )

        )

    [8] => Array

        (

            [id] => 8

            [name] => 游戏本

            [pid] => 3

            [children] => Array

                (

                )

        )

)

优点:关系清楚,修改上下级关系简单。

缺点:使用PHP处理,如果分类数量庞大,效率也会降低。

第二种方法

这种方法是在表字段中增加一个path字段:

表:category
id int 主键,自增
name varchar 分类名称
pid int 父类id,默认0
path varchar 路径
示例数据:

id        name        pid        path
1         电脑        0          0
2         手机        0          0
3         笔记本      1          0-1
4         超级本      3          0-1-3
5         游戏本      3          0-1-3
path字段记录了从根分类到上一级父类的路径,用id+'-'表示。

这种方式,假设我们要查询电脑下的所有后代分类,只需要一条sql语句:

select id,name,path from category where path like (select concat(path,'-',id,'%') as path from category where id=1);
结果:

+----+-----------+-------+
| id | name      | path  |
+----+-----------+-------+
| 3  | 笔记本 | 0-1   |
| 4  | 超级本 | 0-1-3 |
| 5  | 游戏本 | 0-1-3 |
+----+-----------+-------+
这种方式也被很多人所采纳,我总结了下:

优点:查询容易,效率高,path字段可以加索引。

缺点:更新节点关系麻烦,需要更新所有后辈的path字段。

以上就是本文的全部内容了,两种方式,你喜欢哪种?希望大家能够喜欢。

PHP 相关文章推荐
php开发环境配置记录
Jan 14 PHP
ThinkPHP的I方法使用详解
Jun 18 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
摘自织梦CMS的HTTP文件下载类
Aug 08 PHP
php上传图片生成缩略图(GD库)
Jan 06 PHP
php二维码生成以及下载实现
Sep 28 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
微信公众号之主动给用户发送消息功能
Jun 22 PHP
Java和PHP在Web开发方面对比分析
Mar 01 #PHP
php中return的用法实例分析
Feb 28 #PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 #PHP
Windows7下的php环境配置教程
Feb 28 #PHP
php数组使用规则分析
Feb 27 #PHP
php中stdClass的用法分析
Feb 27 #PHP
php中explode的负数limit用法分析
Feb 27 #PHP
You might like
php获取apk包信息的方法
2014/08/15 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
Vuex简单入门
2017/04/19 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
python SMTP实现发送带附件电子邮件
2018/05/22 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
啤酒销售实习自我鉴定
2013/09/24 职场文书
行政助理岗位职责范文
2013/12/03 职场文书
英语自荐信常用语句
2013/12/13 职场文书
商场中秋节广播稿
2014/01/17 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
学校工作推荐信范文
2014/07/11 职场文书
村级个人对照检查材料
2014/08/22 职场文书
家长给老师的感谢信
2015/01/20 职场文书
投标承诺函范文
2015/01/21 职场文书
民主生活会主持词
2015/07/01 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python