無限級分類的原理(遞迴方法)
在web開發當中,我們經常會遇到無限級分類,既中國有北京、天津、河北、河南等省(自治區、直轄市),河北有石家莊、張家口、唐山等地級市,石家莊又有正定縣、無極縣,正定縣又有。。。。
實現這種無限級分類,我們只需要在欄位中增加一個pid,用於記錄父類的id,這時候我們就可以採用遞迴的方式得到最終的結果,這裡面有兩種處理方式,一種是得到一個二維陣列,一種是得到一個多維陣列。具體程式碼如下:
/*由父類得到全部子類,得到一個二維陣列*/ function getChildren2($list,$pid=0){ static $arr = array(); foreach ($list as $key => $value) { if ($value['pid']==$pid) { $arr[] = $value; getChildren2($list,$value['id']); } } return $arr; }
function getChildren($list,$pid=0){
$arr = array();
foreach ($list as $key => $value) {
if ($value['pid']==$pid) {
$value['children']=
getChildren($list,$value['id']);
$arr[] = $value;
}
}
return $arr;
}
兩者實現的程式碼都比較簡單,但因為涉及到了遞迴,好多人就看不懂程式碼了,本文就通過舉例子的方式,帶領大家一步步分析一下程式碼的原理。(A表示遍歷的第一層,B表示遍歷的第二層,B1表示第二層的第一次遍歷,C2表示第三層的第二次遍歷),建議大家邊看邊拿出張紙畫一下。
先是進行遍歷(A層),找到pid為0,也就是最高一級的分類,假如我們找到了北京(id=1),這時候我們就進入了遞迴,搜尋條件pid=0也就變成了pid=1,既找到北京全部的子類。
再次遍歷(B1層),找到一個名為海淀(id=8)的資料,它的pid為1,符合條件,是北京的子類,這時候我們再次進入遞迴,搜尋條件pid=1也就變成了pid=8,既找到海淀全部的子類。
再次遍歷(C1層),找到一個名為中關村(id=15)的資料,它的pid為8,符合條件,是海淀的子類,這時候我們再次進入遞迴,搜尋條件pid=8也就變成了pid=15,既找到中關村全部的子類。
再次遍歷(D1層),發現沒有資料的pid是15,也就是中關村沒有子類,那麼本層遍歷結束,繼續進行C1層的遍歷(既找pid為8的資料),找到一個名為魏公村(id=20)的資料,它的pid是8,符合條件,是海淀的子類,這時候再次進入遞迴,搜尋條件pid=15也就變成了pid=20,既找到魏公村全部的子類。
再次遍歷(D2層),發現沒有資料的pid是20,也就是魏公村沒有子類,那麼本層遍歷結束,繼續進行C1層的遍歷。
遍歷C1層,發現沒有pid為8的資料了,那麼本層(C1)遍歷結束,繼續回到B1層進行遍歷。
遍歷B1層,發現數據朝陽(id=9),它的pid為1,符合條件,是北京的子類,這時候我們再次進入遞迴,搜尋條件pid=1也就變成了pid=9,既找到朝陽全部的子類。
遍歷C2層,發現沒有資料符合條件,退回到B1層。
繼續遍歷B1層,發現沒有資料符合pid=1,既北京的子類已經全部找到了,那麼退回到A層。
繼續遍歷A層,發現河北(id=19)的pid為0,符合條件,這時候我們就進入了遞迴,搜尋條件pid=0也就變成了pid=19,既找到河北全部的子類。
遍歷B2層。。。。。。。。。。。。。。
id name pid
1 北京 0
8 海淀 1
9 朝陽 1
15 中關村 8
19 河北 0
20 魏公村 8
以上是例子當中的部分資料,注意這個順序是可以隨意打亂的,只要你的pid正確就能得到最終的結果。
如果感覺看的比較亂套,還是一點拿出紙和筆,自己列一些資料,按照程式碼的流程自己寫一下,其實很容易理解的。