2019-1-25 14:55:44 星期五
場景:
經銷商有多個層級, 他們之間的組織架構像一顆樹一樣, 其中每個次級經銷商只有一個上級經銷商
但是數據庫中存儲的數據中, 每一條記錄只記錄了相鄰兩個上下級的經銷商id
現在要根據數據庫中的數據, 把所有經銷商按照上下級關系整理出完整的鏈條
下邊以a,b,c第代表不同的經銷商 (也可以用於多層級目錄中)
原理:
1. 如果讀入了 <a, b> 和 <b, c> 兩組數據, 就可以把它倆合並成 <c, <a,b,c>> 然后"擇機"把原來兩條數據刪掉
2. 如果再讀入了 <c, d>, 就可以跟 <c, <a,b,c>> 合並成 <d, <a,b,c,d>>, 然后"擇機"刪掉<c, d>, 和 <c, <a,b,c>>
3. 循環1,2, 其中的"擇機"是指, <a,b> 的b已經沒有下級經銷商了
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 )
注意:
1. 第三行的$dic數組, 存放了上下級關系, 要保證先創建的關系在前邊, 獲取數據的時候記得按照add_time asc排下序
2. 這里是把層級結構以"鏈條"的形式返回, 可以稍作修改整理成多維數組就可以了
硬廣: 模塊化,輕量級PHP框架