一維數組轉樹形結構


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM