首先建立分类信息表:

  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. [Machine-Learning] 机器学习中的几个度量指标

    Several classification metrics for ML/DM methods. 主要解释下机器学习(或数据挖掘)中的几个度量指标. 1. 关于 "TN/TP/FN/FP&q ...

  2. visual studio 引用lib

    方法1: 要具有lib文件和.h文件 1.加入语句 #pragma comment(lib, 'C:\\test\\Debug\\test.lib' 2.项目右键-〉属性-〉c++ -〉常规-〉附加包 ...

  3. 【Spring】初始化Spring IoC容器(非Web应用),并获取Bean

    参考文章 Introduction to the Spring IoC container and beans BeanFactory 和ApplicationContext(Bean工厂和应用上下文 ...

  4. C++高精度计算代码运行时间(转载)

    转载:http://blog.csdn.net/rrrfff/article/details/6583410 //在定时前应该先调用QueryPerformanceFrequency()函数获得机器内 ...

  5. php手册杂记

    1, strcmp()是比较两个字符串的大小,两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值.比较两个字符串的算法是:逐个比较两个串中对应的字符,字符大小按照ASCI ...

  6. EasyUI中动态生成标签页

    这是最近学到的内容,当时是有思路但是不知道怎么获取当前的点击对象,就没有实现功能,通过更深入的学习,我知道了不仅仅是Java,Oracle中有一个this,同样的EasyUI中也存在一个this,来获 ...

  7. HMI开发与控件

    =>控件是什么概念? 百度曰,控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者. 对于HMI开发来说,使用控件可以快速获取到用户的交互(包括按下.释放.点击.拖动 ...

  8. Android:padding和android:layout_margin的区别

    padding是站在父view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离. margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的view之间的距离

  9. [转]jQuery.validate插件在失去焦点时执行验证代码

    转:http://my.oschina.net/enyo/blog/311566 关于 jquery.validate.js 表单验证插件如何在失去焦点时做验证.看手册后发现默认是在表单提交时执行验证 ...

  10. 【原创】Mac os 10.10.3 安装xgboost

    大家用的比较多的是Linux和windows,基于Mac os的安装教程不多, 所以在安装的过程中遇到很多问题,经过较长时间的尝试,可以正常安装和使用, [说在前面]由于新版本的Os操作系统不支持op ...