php實現無限極分類

2021-09-24 04:45:28 字數 4488 閱讀 6528

面試的時候被問到無限極分類的設計和實現,比較常見的做法是在建表的時候,增加乙個pid欄位用來區別自己所屬的分類

$array = array(

array('id' => 1, 'pid' => 0, 'name' => '河北省'),

array('id' => 2, 'pid' => 0, 'name' => '北京市'),

array('id' => 3, 'pid' => 1, 'name' => '邯鄲市'),

array('id' => 4, 'pid' => 2, 'name' => '朝陽區'),

array('id' => 5, 'pid' => 2, 'name' => '通州區'),

array('id' => 6, 'pid' => 4, 'name' => '望京'),

array('id' => 7, 'pid' => 4, 'name' => '酒仙橋'),

array('id' => 8, 'pid' => 3, 'name' => '永年區'),

array('id' => 9, 'pid' => 1, 'name' => '武安市'),);1

2345

6789

1011

資料在資料庫中儲存大概是這個樣子,怎麼實現無限極遞迴呢,有兩種常用的做法,遞迴和引用演算法

遞迴演算法

/*** 遞迴實現無限極分類

* @param $array 分類資料

* @param $pid 父id

* @param $level 分類級別

* @return $list 分好類的陣列 直接遍歷即可 $level可以用來遍歷縮排

*/function gettree($array, $pid =0, $level = 0)

}return $list;}/*

* 獲得遞迴完的資料,遍歷生成分類

*/$array = gettree($array);

foreach($array) as $value

//輸出結果 無限極分類實現ok

河北省--邯鄲市

----永年區

--武安市

北京市--朝陽區

----望京

----酒仙橋

--通州區12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

4344

4546

4748

引用演算法

function generatetree($array)

//第二部 遍歷資料 生成樹狀結構

$tree = array();

foreach($items as $key => $value)else

}return $tree;

}//經過第一步 資料變成了這樣

array

([1] => array

([id] => 1

[pid] => 0

[name] => 河北省

[children] => array()

[2] => array

([id] => 2

[pid] => 0

[name] => 北京市

[children] => array()

[3] => array

([id] => 3

[pid] => 1

[name] => 邯鄲市

[children] => array()

[4] => array

([id] => 4

[pid] => 2

[name] => 朝陽區

[children] => array()

[5] => array

([id] => 5

[pid] => 2

[name] => 通州區

[children] => array()

[6] => array

([id] => 6

[pid] => 4

[name] => 望京

[children] => array()

[7] => array

([id] => 7

[pid] => 4

[name] => 酒仙橋

[children] => array()

[8] => array

([id] => 8

[pid] => 3

[name] => 永年區

[children] => array()

[9] => array

([id] => 9

[pid] => 1

[name] => 武安市

[children] => array()

//第一步很容易就能看懂,就是構造資料,現在咱們仔細說一下第二步

$tree = array();

//遍歷構造的資料

foreach($items as $key => $value)else

}//這個方法的核心在於引用,php變數預設的傳值方式是按指傳遞

//也就是說 假如說 遍歷順序是 河北省 邯鄲市 當遍歷到河北省時 會把河北省放到tree中 遍歷到邯鄲市時 會把邯鄲市放到河北省的子節點陣列中 但是!!! 這會兒的tree陣列中 河北省已經放進去了 根據php變數按值傳遞的規則 你並沒有更改tree陣列中的河北省的資料 所以這裡用到了引用傳遞

//當你對河北省做更改時,tree陣列中的河北省也一併做了更改 下面我們做個實驗 我們把引用傳遞去掉,看一下結果

//使用普通傳值輸出結果

array

([0] => array

([id] => 1

[pid] => 0

[name] => 河北省

)[1] => array

([id] => 2

[pid] => 0

[name] => 北京市))

//可以看到 只有河北省和北京市輸出出來了 因為他們倆是第一級節點 而且排行1和2,放到$tree陣列中之後,沒有使用引用傳遞,那麼後續對他倆的子節點的操作都沒有在$tree中生效,現在我們更改一下順序 把邯鄲市放到河北省的前面 那麼根據咱們的推斷 那麼邯鄲市就應該出現在tree陣列裡

//邯鄲市放到河北省前面的輸出結果

array

([0] => array

([id] => 1

[pid] => 0

[name] => 河北省

[son] => array

([0] => array

([id] => 3

[pid] => 1

[name] => 邯鄲市

)[1] => array

([id] => 2

[pid] => 0

[name] => 北京市

)//果然是這樣 那麼證明我們的推斷是正確的 現在我們把引用傳值改回去 再看一下

//使用引用傳值輸出結果

array

([1] => array

([id] => 1

[pid] => 0

[name] => 河北省

[children] => array

([0] => array

([id] => 3

[pid] => 1

[name] => 邯鄲市

[children] => array

([0] => array

([id] => 8

[pid] => 3

[name] => 永年區

)[1] => array

([id] => 9

[pid] => 1

[name] => 武安市

)[2] => array

([id] => 2

[pid] => 0

[name] => 北京市

[children] => array

([0] => array

([id] => 4

[pid] => 2

[name] => 朝陽區

[children] => array

([0] => array

([id] => 6

[pid] => 4

[name] => 望京

)[1] => array

([id] => 7

[pid] => 4

[name] => 酒仙橋

)[1] => array

([id] => 5

[pid] => 2

[name] => 通州區))

//樹狀結構完美的輸出出來了 這個方法的核心就是引用傳值

php實現無限極分類

利用兩個for迴圈實現無限級分類 表 欄位名字段型別 備註預設值 idint 主鍵 auto increment name varchar 分類名稱 pidint 父類id0 頂級分類的 pid 預設就是0了。當我們想取出某個分類的子分類樹的時候,基本思路就是遞迴,當然,出於效率問題不建議每次遞迴都...

PHP實現無限極分類

created by epp4.user t470 date 15 08 08 time 上午12 00 準備陣列,代替從資料庫中檢索出的資料 共有三個必須欄位id,name,pid header content type text html charset utf 8 categories arr...

php實現無限極分類

最近在負責報表自動化管理的小功能,想從工作內容中整理點東西形成部落格。但是過程中發現,這功能並沒有 實現上的難點。基本上值得說的地方,也就定時任務的合理設計,而定時任務之前有相關的博文。再有就是,開發思路和資料庫合理的設計。這部分也不好形成文章。但是好久沒有寫部落格,希望能堅持下來。想起之前寫過幾個...