2019-1-25 14:55:44 星期五git
場景:數據庫
經銷商有多個層級, 他們之間的組織架構像一顆樹同樣, 其中每一個次級經銷商只有一個上級經銷商數組
可是數據庫中存儲的數據中, 每一條記錄只記錄了相鄰兩個上下級的經銷商id架構
如今要根據數據庫中的數據, 把全部經銷商按照上下級關係整理出完整的鏈條框架
下邊以a,b,c第表明不一樣的經銷商 (也能夠用於多層級目錄中)模塊化
原理:spa
1. 若是讀入了 <a, b> 和 <b, c> 兩組數據, 就能夠把它倆合併成 <c, <a,b,c>> 而後"擇機"把原來兩條數據刪掉code
2. 若是再讀入了 <c, d>, 就能夠跟 <c, <a,b,c>> 合併成 <d, <a,b,c,d>>, 而後"擇機"刪掉<c, d>, 和 <c, <a,b,c>>blog
3. 循環1,2, 其中的"擇機"是指, <a,b> 的b已經沒有下級經銷商了get
1 // 由於次級經銷商只有一個上級經銷商, 因此以次級經銷商爲鍵, 方便程序處理 2 // 次級經銷商 => 上級經銷商 3 $dic = [ 4 'a' => 'root', //無上級經銷商 5 'b' => 'a', 6 'c' => 'b', 7 'd' => 'c', 8 'e' => 'd', 9 'f' => 'b', 10 'g' => 'f', 11 'h' => 'd', 12 'i' => 'h', 13 ]; 14 15 echo '<pre>'; 16 17 //整理每一個經銷都有哪些次級經銷商 18 $list = []; 19 foreach($dic as $id => $parent_id){ 20 $list[$parent_id][$id] = 1; 21 } 22 23 print_r($list); 24 25 $stacks = []; //棧, 最後一級經銷商 => 以逗號隔開的上級經銷商 26 27 foreach ($dic as $id => $parent_id) { 28 unset($list[$parent_id][$id]); //刪除次級經銷商, 爲了方便判斷某個上級經銷商的次級經銷商是否都處理過 29 30 if (empty($stacks[$parent_id])) { 31 $stacks[$id] = $parent_id.','.$id; 32 33 } else { 34 $stacks[$id] = $stacks[$parent_id].','.$id; //整合成新的 35 36 if (empty($list[$parent_id])) { 37 unset($stacks[$parent_id]); // 刪除中間鏈條, 好比, b只有兩個次級經銷商c,d, 和一個上級經銷商a, 那麼找出a,b,c 和 a,b,d 兩個鏈條後, 就把中間鏈條a,b刪除掉, 只保留最長的鏈條 38 } 39 } 40 } 41 42 print_r($stacks); 43 44 45 結果: 46 47 Array 48 ( 49 [e] => root,a,b,c,d,e 50 [g] => root,a,b,f,g 51 [i] => root,a,b,c,d,h,i 52 )
注意: 這裏是把層級結構以"鏈條"的形式返回, 能夠稍做修改整理成多維數組就能夠了
硬廣: 模塊化,輕量級PHP框架