国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP實現查詢多級分類的程序代碼

2024-05-04 21:58:14
字體:
來源:轉載
供稿:網友

無限級分類是我們常用見的一個程序方法了,原理是得到有層級關系的數組,就是頂級是頂級分類,然后每個分類中有個children子數組,記錄它的子分類,這樣一級一級的分級數組.

算法的數據庫結構設計最為簡單,category表中一個字段id,一個字段fid(父id),這樣可以根據WHERE id = fid來判斷上一級內容,運用遞歸至最頂層.

我們先查出數組,代碼如下:

  1. <?php 
  2. $a = array
  3.   'AAAAAA'  =>  array
  4.         'aaaaaa' => array
  5.                  '111111'
  6.                  '222222'
  7.                  '333333' 
  8.         ), 
  9.         'bbbbbb'  => array
  10.                   '111111'
  11.                  '222222'
  12.                  '333333' 
  13.         ), 
  14.         'cccccc'  => array
  15.                   '111111'
  16.                   '222222'
  17.                   '333333' 
  18.         ),                       
  19.   ), 
  20.   'BBBBBB'  =>   array
  21.         'aaaaaa' => array
  22.                   '111111'
  23.                   '222222'
  24.                   '333333' 
  25.         ), 
  26.         'bbbbbb'=> array
  27.                   '111111'
  28.                   '222222'
  29.                   '333333' 
  30.         ), 
  31.         'cccccc'=> array
  32.                   '111111'
  33.                   '222222'
  34.                   '333333' 
  35.         ), 
  36.   ), 
  37.   'CCCCCC'  => array
  38.         'aaaaaa'=> array
  39.                   '111111'
  40.                   '222222'
  41.                   '333333' 
  42.         ), 
  43.         'bbbbbb'=> array
  44.                   '111111'
  45.                   '222222'
  46.                   '333333' 
  47.         ), 
  48.         'cccccc'         => array
  49.                   '111111'
  50.                   '222222'
  51.                   '333333' 
  52.         ), 
  53.   ), 
  54. ); 
  55. foreach ($a as $k=>$v){ 
  56.    echo $k."<br>"
  57.   // if(is_array($v)){ 
  58.        foreach($v as $key=>$val){ 
  59.           echo "  ".$key."<br>"
  60.   //     }                             
  61.        if(is_array($val)){ 
  62.           foreach($val as $kkk=>$vall){ 
  63.              echo "    ".$vall."<br>"
  64.           } 
  65.        } 
  66.    } 
  67.    echo "<br>"
  68.    } 
  69.     
  70.     
  71.     /*******mysql查詢無限級分類的代碼******/ 
  72.     /*** 
  73.    $sql = "SELECT a.Title AS big, b.Title AS small  
  74.             FROM largeTitle AS a LEFT JOIN smallTitle  AS b ON  a.ID=b.LargeID"; 
  75.              
  76.     $a = array(); 
  77.      
  78.     $r = mysql_query($sql); 
  79.      
  80.     while( $arr = mysql_fetch_array($r)){ 
  81.         $a[$arr['big']] = $arr['small']; 
  82.     } 
  83.     ***/ 
  84. ?> 

好了下面先讀取數據庫然后再遞歸讀出.

分類表,比如category,字段有 id,parentid,title,代碼如下:

  1. //查詢 
  2.  
  3. $dsql->SetQuery("SELECT * FROM category ORDER BY sortorder ASC"); 
  4. $dsql->Execute('parentlist'); 
  5. $array = array(); 
  6. $parentlist = array(); 
  7. while ($rs=$dsql->getObject('parentlist')) 
  8.     if($rs->parentid == 0) 
  9.     { 
  10.         $parentlist[$rs->id] = (array)$rs
  11.     } 
  12.     else 
  13.     { 
  14.         $array[$rs->id] = (array)$rs
  15.     } 
  16. $parentlist = cat_options($parentlist$array);  //我們求的結果數組 
  17.  
  18. //$list父級分類的數組 
  19.  
  20. //$array是除父級分類外的全部分類的數組 
  21.  
  22. function cat_options(&$list,&$array
  23.     foreach ($list as $key => $arr
  24.     { 
  25.         foreach ($array as $k => $value
  26.         { 
  27.             if($value['parentid'] == $arr['id']) 
  28.             { 
  29.                 $list[$key]['children'][] = $value
  30.                 unset($array[$k]); 
  31.             } 
  32.         } 
  33.     } 
  34.     foreach ($list as $key => $arr
  35.     { 
  36.         if(is_array($arr['children']) && count($arr['children']) > 0) 
  37.         { 
  38.             $list[$key]['children'] = cat_options($list[$key]['children'], $array); 
  39.         } 
  40.     } 
  41.     return $list

其它的方法,設置fid字段類型為varchar,將父類id都集中在這個字段里,用符號隔開,比如:1,3,6,這樣可以比較容易得到各上級分類的ID,而且在查詢分類下的信息的時候,可以使用:SELECT * FROM category WHERE pid LIKE “1,3%”,代碼如下:

  1. --  
  2. -- 表的結構 `category`  
  3. --  
  4. CREATE TABLE IF NOT EXISTS `category` (  
  5. `id` int(11) NOT NULL AUTO_INCREMENT,  
  6. `type` int(11) NOT NULL COMMENT '1為文章類型2為產品類型3為下載類型',  
  7. `title` varchar(50) NOT NULL,  
  8. `lft` int(11) NOT NULL,  
  9. `rgt` int(11) NOT NULL,  
  10. `lorder` int(11) NOT NULL COMMENT '排序',  
  11. `create_time` int(11) NOT NULL,  
  12. PRIMARY KEY (`id`)  
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;  
  14. --  
  15. -- 導出表中的數據 `category`  
  16. --  
  17. INSERT INTO `category` (`id`, `type`, `title`, `lft`, `rgt`, `lorder`, `create_time`) VALUES  
  18. (1, 1, '頂級欄目', 1, 18, 1, 1261964806),  
  19. (2, 1, '公司簡介', 14, 17, 50, 1264586212),  
  20. (3, 1, '新聞', 12, 13, 50, 1264586226),  
  21. (4, 2, '公司產品', 10, 11, 50, 1264586249),  
  22. (5, 1, '榮譽資質', 8, 9, 50, 1264586270),  
  23. (6, 3, '資料下載', 6, 7, 50, 1264586295),  
  24. (7, 1, '人才招聘', 4, 5, 50, 1264586314),  
  25. (8, 1, '留言板', 2, 3, 50, 1264586884),  
  26. (9, 1, '總裁', 15, 16, 50, 1267771951); 
  27.  
  28. /**  
  29. * 顯示樹,把所有的節點都顯示出來。  
  30. * 1、先得到根結點的左右值(默認根節點的title為“頂級目錄”)。  
  31. * 2、查詢左右值在根節點的左右值范圍內的記錄,并且根據左值排序。  
  32. * 3、如果本次記錄右值大于前次記錄的右值則為子分類,輸出時候加空格。  
  33. * @return array  
  34. **/  
  35. function display_tree(){ 
  36.  
  37. //獲得root左邊和右邊的值  
  38. $arr_lr = $this->category->where("title = '頂級欄目'")->find();  
  39. //print_r($arr_lr);  
  40. if($arr_lr){  
  41. $right = array();  
  42. $arr_tree = $this->category->query("SELECT id, type, title, rgt FROM category WHERE lft >= "$arr_lr['lft'] ." AND lft <=".$arr_lr['rgt']." ORDER BY lft");  
  43. foreach($arr_tree as $v){  
  44. if(count($right)){  
  45. while ($right[count($right) -1] < $v['rgt']){  
  46. array_pop($right);  
  47. }  
  48. }  
  49. $title = $v['title'];  
  50. if(count($right)){  
  51. $title = '|-'.$title;  
  52. }  
  53. $arr_list[] = array('id' => $v['id'], 'type' => $type'title' => str_repeat(' 'count($right)).$title'name' =>$v['title']);  
  54. $right[] = $v['rgt'];  
  55. }  
  56. return $arr_list;  
  57. }  

好了 只要這樣所有的分類都可以一次性查詢出來了,而不用通過遞歸了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤台县| 忻城县| 英吉沙县| 军事| 庆元县| 阳谷县| 亚东县| 沙河市| 斗六市| 盐山县| 六安市| 团风县| 米泉市| 天全县| 无棣县| 轮台县| 青岛市| 红桥区| 广东省| 吴堡县| 吉安市| 洪雅县| 濮阳县| 浪卡子县| 六安市| 内乡县| 建瓯市| 璧山县| 桑日县| 简阳市| 台前县| 阜新| 遵义县| 金堂县| 介休市| 景洪市| 白朗县| 孟州市| 廊坊市| 抚顺市| 宁南县|