实现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命名空间(Namespace)的使用详解
May 04 PHP
PHP操作MySQL事务实例
Nov 05 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
PHP常量define和const的区别详解
May 18 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 PHP
Laravel validate error处理,ajax,json示例
Oct 25 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
Apr 27 PHP
PHP数组与字符串互相转换实例
May 05 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可变函数的使用详解
2013/06/14 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
js实现放大镜特效
2017/05/18 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
vue实现树形菜单效果
2018/03/19 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
python奇偶行分开存储实现代码
2018/03/19 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python xlwt模块使用代码实例
2020/06/10 Python
python 实现超级玛丽游戏
2020/11/25 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
直接有效的自我评价
2014/01/11 职场文书
烹调加工管理制度
2014/02/04 职场文书
运动会800米加油稿
2014/02/22 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书