zoukankan      html  css  js  c++  java
  • 一维数组转树形结构

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

  • 相关阅读:
    [记录]MySQL 查询无法导出到文件
    Unity3D 在Update中不要过多地修改Transform 信息
    Unity3D 中 脚本(MonoBehaviour) 生命周期WaitForEndOfFrame需要注意的地方
    RunTime的简单使用
    GIT命令行的使用
    UIImagePickerController和UIAlertController结合使用
    NSSortDescriptor对象进行数组排序
    for..in遍历,枚举器
    Objective
    Objective
  • 原文地址:https://www.cnblogs.com/iLoveMyD/p/10320015.html
Copyright © 2011-2022 走看看