1. 程式人生 > >無限級分類的原理(遞迴方法)

無限級分類的原理(遞迴方法)

在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正確就能得到最終的結果。

如果感覺看的比較亂套,還是一點拿出紙和筆,自己列一些資料,按照程式碼的流程自己寫一下,其實很容易理解的。