首先建立分类信息表:

  1. CREATE TABLE IF NOT EXISTS `category` (
  2. `categoryId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  3. `parentId` smallint(5) unsigned NOT NULL DEFAULT '0',
  4. `categoryName` varchar(50) NOT NULL,
  5. PRIMARY KEY (`categoryId`)
  6. )  ;

插入若干数据:

  1. INSERT INTO `category` (`categoryId`, `parentId`, `categoryName`) VALUES
  2. (1, 0, 'php'),
  3. (2, 0, 'java'),
  4. (3, 0, 'c/c++'),
  5. (4, 1, 'php基础'),
  6. (5, 1, 'php开源资料'),
  7. (6, 1, 'php框架'),
  8. (7, 2, 'java Se'),
  9. (8, 2, 'java EE'),
  10. (9, 2, 'java Me'),
  11. (10, 3, 'c/c++基础编程'),
  12. (11, 3, 'c/c++系统开发'),
  13. (12, 3, 'c嵌入式编程'),
  14. (13, 3, 'c++应用开发'),
  15. (14, 13, 'c++桌面应用开发'),
  16. (15, 13, 'c++游戏开发');

下面是php代码:

  1. <?php
  2. /*
  1. php无限极分类
  1. */
  2. //获取某分类的直接子分类
  3. function getSons($categorys,$catId=0){
  4. $sons=array();
  5. foreach($categorys as $item){
  6. if($item['parentId']==$catId)
  7. $sons[]=$item;
  8. }
  9. return $sons;
  10. }
  11. //获取某个分类的所有子分类
  12. function getSubs($categorys,$catId=0,$level=1){
  13. $subs=array();
  14. foreach($categorys as $item){
  15. if($item['parentId']==$catId){
  16. $item['level']=$level;
  17. $subs[]=$item;
  18. $subs=array_merge($subs,getSubs($categorys,$item['categoryId'],$level+1));
  19. }
  20. }
  21. return $subs;
  22. }
  23. //获取某个分类的所有父分类
  24. //方法一,递归
  25. function getParents($categorys,$catId){
  26. $tree=array();
  27. foreach($categorys as $item){
  28. if($item['categoryId']==$catId){
  29. if($item['parentId']>0)
  30. $tree=array_merge($tree,getParents($categorys,$item['parentId']));
  31. $tree[]=$item;
  32. break;
  33. }
  34. }
  35. return $tree;
  36. }
  37. //方法二,迭代
  38. function getParents2($categorys,$catId){
  39. $tree=array();
  40. while($catId != 0){
  41. foreach($categorys as $item){
  42. if($item['categoryId']==$catId){
  43. $tree[]=$item;
  44. $catId=$item['parentId'];
  45. break;
  46. }
  47. }
  48. }
  49. return $tree;
  50. }
  51. //测试 部分
  52. $pdo=new PDO('mysql:host=localhost;dbname=test','root','8888');
  53. $stmt=$pdo->query("select * from category order by categoryId");
  54. $categorys=$stmt->fetchAll(PDO::FETCH_ASSOC);
  55. $result=getSons($categorys,1);
  56. foreach($result as $item)
  57. echo $item['categoryName'].'<br>';
  58. echo '<hr>';
  59. $result=getSubs($categorys,0);
  60. foreach($result as $item)
  61. echo str_repeat('  ',$item['level']).$item['categoryName'].'<br>';
  62. echo '<hr>';
  63. $result=getParents($categorys,7);
  64. foreach($result as $item)
  65. echo $item['categoryName'].' >> ';
  66. echo '<hr>';
  67. $result=getParents2($categorys,15);
  68. foreach($result as $item)
  69. echo $item['categoryName'].' >> ';
  70. ?>

下面是运行的结果:

文章来源:http://blog.csdn.net/kankan231/article/details/8462349

php之无限极分类的更多相关文章

  1. php无限极分类以及递归(thinkphp)

    php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...

  2. js实现无限极分类

    转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来 ...

  3. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

  4. PHP无限极分类

      当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱, ...

  5. PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂

    当你学习php无限极分类的时候,大家都觉得一个字"难"我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究.   到网上一搜php无限极分类,很多,但好多都是一 ...

  6. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

    今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...

  7. 谈一次php无限极分类的案例

    作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  8. PHP无限极分类生成树方法,无限分级

    你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了.这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. function g ...

  9. PHP无限极分类实现

    简单版的PHP生成无限极分类代码.其中包括了数据库设计.以及输出分类HTML代码. SQL代码 CREATE TABLE `district` ( `id` int(10) unsigned NOT ...

随机推荐

  1. Flowplayer-playlist

    SOURCE URL: https://flowplayer.org/docs/playlist.html HTML layout Here is a typical setup for a play ...

  2. 【iOS】我的Objective-C学习笔记

    1.代码中增加标记 #pragma mark - #pragma mark 2.点语法 Person *p = [Person new]; // 点语法的本质还是方法调用 p.age = 10; // ...

  3. JavaScript高级应用(二)(转)

    1.组件是否安装 //组件是否安装 isComponentInstalled("{6B053A4B-A7EC-4D3D-4567-B8FF8A1A5739}", "com ...

  4. Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(1)

    本篇内容为,通过 I2C 配置 GY-91 MPU9250+BMP280 里面的 MPU9250 连接 AK8963 磁感应.两个办法,1)MPU9250 设置 Master Mode 通过 AUX ...

  5. My favorite bit torrent client for Ubuntu

    Deluge Bit Torrent ClientDeluge is among my favorite bit torrent clients for Ubuntu. It is fast, sli ...

  6. 01-C语言概述

    本文目录 一.C语言简史 二.C语言的特点 三.C语言能做什么? 四.C语言的版本问题 五.C语言语法预览 回到顶部 一.C语言简史 C语言于1972年发明,首次使用是用于重写UINX操作系统(UNI ...

  7. 19 Using Optimizer Hints

    19.1 Overview of Optimizer Hints A hint is an instruction to the optimizer. In a test or development ...

  8. 解决JSP路径问题的方法(jsp文件开头path, basePath作用)

    原文:http://blog.csdn.net/mingxunzh/article/details/4627185 在JSP中的如果使用 "相对路径"  则有可能会出现问题. 因为 ...

  9. 分方式缓存常用的一致性hash是什么原理

    分方式缓存常用的一致性hash是什么原理 一致性hash是用来解决什么问题的?先看一个场景有n个cache服务器,一个对象object映射到哪个cache上呢?可以采用通用方法计算object的has ...

  10. ORM原型概念

    ORM[Object-Relation-Mapping]对象关系映射. 这个名词已经出来好几年了.已经不陌生.  以前在项目中针对相对复杂业务逻辑时一般采用领域模型驱动方式进行业务概述,分析和建模. ...