一维数组转树形结构, 树形结构的存储与读取
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. 这里是把层级结构以"链条"的形式返回, 可以稍作修改整理成多维数组就可以了
② 由链条生成树型结构
案例: https://www.cnblogs.com/iLoveMyD/p/8847056.html
硬广: 模块化,轻量级PHP框架