一维数组转树形结构

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

原文地址:https://www.cnblogs.com/iLoveMyD/p/10320015.html