無限級分類是開發中常見的情況,也經常會在面試,主考官問到,筆試中遇到,因此本文對常見的無限極分類演算法進行總結歸納,其實大多數就是迭代與遞迴。
1.迴圈迭代實現
輸出:$arr = [
1=>['id'=>1,'name'=>'父1','father'=>null],
2=>['id'=>2,'name'=>'父2','father'=>null],
3=>['id'=>3,'name'=>'父3','father'=>null],
4=>['id'=>4,'name'=>'兒1-1','father'=>1],
5=>['id'=>5,'name'=>'兒1-2','father'=>1],
6=>['id'=>6,'name'=>'兒1-3','father'=>1],
7=>['id'=>7,'name'=>'兒2-1','father'=>2],
8=>['id'=>8,'name'=>'兒2-1','father'=>2],
9=>['id'=>9,'name'=>'兒3-1','father'=>3],
10=>['id'=>10,'name'=>'兒3-1-1','father'=>9],
11=>['id'=>11,'name'=>'兒1-1-1','father'=>4],
12=>['id'=>12,'name'=>'兒2-1-1','father'=>7],
];function generatetree($items)else
} return $tree;
}$tree = generatetree($arr);
print_r(json_encode($tree));
分析:這個演算法利用了迴圈迭代,將線性結構按照父子關係以樹形結構輸出,演算法的關鍵在於使用了引用.
優點:速度快,效率高.
缺點:陣列的key值必須與id值相同,不便於取出資料(同樣使用迭代獲取資料)
2.遞迴實現
輸出$arr = [
0=>['id'=>1,'name'=>'父1','father'=>0],
1=>['id'=>2,'name'=>'父2','father'=>0],
2=>['id'=>3,'name'=>'父3','father'=>0],
3=>['id'=>4,'name'=>'兒1-1','father'=>1],
4=>['id'=>5,'name'=>'兒1-2','father'=>1],
5=>['id'=>6,'name'=>'兒1-3','father'=>1],
6=>['id'=>7,'name'=>'兒2-1','father'=>2],
7=>['id'=>8,'name'=>'兒2-1','father'=>2],
8=>['id'=>9,'name'=>'兒3-1','father'=>3],
9=>['id'=>10,'name'=>'兒3-1-1','father'=>9],
10=>['id'=>11,'name'=>'兒1-1-1','father'=>4],
11=>['id'=>12,'name'=>'兒2-1-1','father'=>7],
];function generatetree($arr,$id,$step)
} return $tree;
}$tree = generatetree($arr,0,0);
foreach ($tree as $val)
分析:利用了遞迴,陣列的key值與id值可以不相同,最後以順序的結構輸出陣列
優點:方便遍歷,查詢父子元素
缺點:php不擅長遞迴,資料量大的情況下效率會顯著降低
2021金三銀四大廠面試真題集錦,必看!
四年精華php技術文章整理合集——php框架篇
四年精華php技術文合集——微服務架構篇
四年精華php技術文合集——分布式架構篇
四年精華php技術文合集——高併發場景篇
四年精華php技術文章整理合集——資料庫篇
無限極分類
面試的時候被問到無限極分類的設計和實現,比較常見的做法是在建表的時候,增加乙個pid欄位用來區別自己所屬的分類 array array array id 1,pid 0,name 河北省 array id 2,pid 0,name 北京市 array id 3,pid 1,name 邯鄲市 arra...
無限極分類,遞迴分類
有一組陣列如下 items array 1 array id 1,pid 0,name 江西省 2 array id 2,pid 0,name 黑龍江省 3 array id 3,pid 1,name 南昌市 4 array id 4,pid 2,name 哈爾濱市 5 array id 5,pid...
php無限極分類
無限級分類 param1 array categories,要分類的陣列 param2 int stop id 不需要查詢子分類的id param3 int parent id 0,要查詢父分類id 欄位名稱 param4 int level 0,當前商品分類所屬的層級 根據level計算縮排的距離...