登录 | 注册

PHP + MySQL 无限分类实现的2种方法

首页 > 程序开发 > PHP 2018-02-12 16:06:07 浏览次 共 条评论

收藏赞(分享

无限分类是个老话题了,PHP和MySQL中实现无限分类的思路也有许多种,本文主要介绍其中2种最巧妙的无限分类方法,一起来看看吧。

 

第一种方法

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

表:category
id int 主键,自增
name varchar 分类名称
pid int 父类id,默认0

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

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

  1. $categories = array( 
  2.     array('id'=>1,'name'=>'电脑','pid'=>0), 
  3.     array('id'=>2,'name'=>'手机','pid'=>0), 
  4.     array('id'=>3,'name'=>'笔记本','pid'=>1), 
  5.     array('id'=>4,'name'=>'台式机','pid'=>1), 
  6.     array('id'=>5,'name'=>'智能机','pid'=>2), 
  7.     array('id'=>6,'name'=>'功能机','pid'=>2), 
  8.     array('id'=>7,'name'=>'超级本','pid'=>3), 
  9.     array('id'=>8,'name'=>'游戏本','pid'=>3), 
  10. ); 

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

电脑
—笔记本
——-超级本
——-游戏本
—台式机
手机
—智能机
—功能机

用数组来表示的话,可以增加一个 children 键来存储它的子分类:


  1. array( 
  2.     //1对应id,方便直接读取 
  3.     1 => array( 
  4.         'id'=>1, 
  5.         'name'=>'电脑'
  6.         'pid'=>0, 
  7.         children=>array( 
  8.             &array( 
  9.                 'id'=>3, 
  10.                 'name'=>'笔记本'
  11.                 'pid'=>1, 
  12.                 'children'=>array( 
  13.                     //此处省略 
  14.                 ) 
  15.             ), 
  16.             &array( 
  17.                 'id'=>4, 
  18.                 'name'=>'台式机'
  19.                 'pid'=>1, 
  20.                 'children'=>array( 
  21.                     //此处省略 
  22.                 ) 
  23.             ), 
  24.         ) 
  25.     ), 
  26.     //其他分类省略 

处理过程:


  1. $tree = array(); 
  2. //第一步,将分类id作为数组key,并创建children单元 
  3. foreach($categories as $category){ 
  4.     $tree[$category['id']] = $category; 
  5.     $tree[$category['id']]['children'] = array(); 
  6. //第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。 
  7. foreach ($tree as $k=>$item) { 
  8.     if ($item['pid'] != 0) { 
  9.         $tree[$item['pid']]['children'][] = &$tree[$k]; 
  10.     } 
  11. print_r($tree); 

免责声明:本文来源于,由网友提供或网络搜集,仅供个人研究、交流学习使用,不涉及商业盈利目的。如有版权问题,请联系本站管理员予以更改或删除。优知网会定期发布程序开发相关趋势文章,包括 PHP Android IOS Java C/C++ 软件测试 大数据 Linux 全栈开发 等领域,敬请关注!

分享到
人收藏5 收藏
 
 
 

咨询中心

优就业微信扫一扫
微信扫一扫

400-650-7353

加入官方微博