一維數組轉樹形結構

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框架

相關文章
相關標籤/搜索