实现PHP+Mysql无限分类的方法汇总
《PHP实战:实现PHP+Mysql无限分类的方法汇总》要点: 无限分类是个老话题了,来看看PHP结合Mysql如何实现. 第一种办法 这种办法是很常见、很传统的一种,先看表结构 表:category 先来构建一个原始数组,这个直接从数据库中拉出来就行:
代码如下:
$categories = array( ??? array('id'=>1,'name'=>'电脑','pid'=>0), ??? array('id'=>2,'name'=>'手机', ??? array('id'=>3,'name'=>'笔记本','pid'=>1), ??? array('id'=>4,'name'=>'台式机', ??? array('id'=>5,'name'=>'智能机','pid'=>2), ??? array('id'=>6,'name'=>'功能机', ??? array('id'=>7,'name'=>'超级本','pid'=>3), ??? array('id'=>8,'name'=>'游戏本', ); 目标是将它转化为下面这种结构 电脑
代码如下:
array( ??? //1对应id,便利直接读取 ??? 1 => array( ??????? 'id'=>1, ??????? 'name'=>'电脑', ??????? 'pid'=>0, ??????? children=>array( ??????????? &array( ??????????????? 'id'=>3, ??????????????? 'name'=>'笔记本', ??????????????? 'pid'=>1, ??????????????? 'children'=>array( ??????????????????? //此处省略 ??????????????? ) ??????????? ), ??????????? &array( ??????????????? 'id'=>4, ??????????????? 'name'=>'台式机', ??????? ) ??? ), ??? //其他分类省略 ) 处理过程:
代码如下:
$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??????? name??????? pid??????? path 这种方式,假设我们要查询电脑下的所有后代分类,只必要一条sql语句: select id,name,path from category where path like (select concat(path,'-',id,'%') as path from category where id=1); +----+-----------+-------+ 优点:查询容易,效率高,path字段可以加索引. 缺点:更新节点关系麻烦,必要更新所有后辈的path字段. 以上便是本文的全部内容了,两种方式,你喜欢哪种?希望大家能够喜欢. 编程之家培训学院每天发布《PHP实战:实现PHP+Mysql无限分类的方法汇总》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |