面試的時候被問到無限極分類的設計和實現,比較常見的做法是在建表的時候,增加乙個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實現無限極分類
最近在負責報表自動化管理的小功能,想從工作內容中整理點東西形成部落格。但是過程中發現,這功能並沒有 實現上的難點。基本上值得說的地方,也就定時任務的合理設計,而定時任務之前有相關的博文。再有就是,開發思路和資料庫合理的設計。這部分也不好形成文章。但是好久沒有寫部落格,希望能堅持下來。想起之前寫過幾個...