树形结构的数据存储与读取(非递归)

应用场景:

1. 公司内部人员的组织架构

2. 经销商系统, 其中每个经销商只有一个上级经销商(或某种产品只能从一个上家拿货)

3. 论坛回复, 盖楼

原理:

下边以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. 数据库中存储的数据中, 每一条记录只需记录相邻两个上下级的经销商id;

2. 如果下级经销商只能代理上级的某个产品, 代理不同的产品可以有多个上家, 那么这时, 可以同时记录下来这个产品的信息, 取数的时候, 按照此产品来作为结构的连线

组装成树形结构的代码:

// 因为次级经销商只有一个上级经销商, 所以以次级经销商为键, 方便程序处理
// 次级经销商 => 上级经销商
$dic = [
    'a' => 'root', //无上级经销商
    'b' => 'a',
    'c' => 'b',
    'd' => 'c',
    'e' => 'd',
    'f' => 'b',
    'g' => 'f',
    'h' => 'd',
    'i' => 'h',
];

echo '<pre>';

//整理每个经销都有哪些次级经销商
$list = [];
foreach($dic as $id => $parent_id){
    $list[$parent_id][$id] = 1;
}

print_r($list);

$stacks = []; //栈, 最后一级经销商 => 以逗号隔开的上级经销商

foreach ($dic as $id => $parent_id) {
    unset($list[$parent_id][$id]); //删除次级经销商, 为了方便判断某个上级经销商的次级经销商是否都处理过

    if (empty($stacks[$parent_id])) {
        $stacks[$id] = $parent_id.','.$id;

    } else {
        $stacks[$id] = $stacks[$parent_id].','.$id; //整合成新的

        if (empty($list[$parent_id])) {
            unset($stacks[$parent_id]); // 删除中间链条, 比如, b只有两个次级经销商c,d, 和一个上级经销商a, 那么找出a,b,c 和 a,b,d 两个链条后, 就把中间链条a,b删除掉, 只保留最长的链条
        }
    }
}

print_r($stacks);


结果:

Array
(
    [e] => root,a,b,c,d,e
    [g] => root,a,b,f,g
    [i] => root,a,b,c,d,h,i
)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值