php之无限极分类

首先建立分类信息表:

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


下面是运行的结果:

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

原文地址:https://www.cnblogs.com/isboy/p/3860957.html