应用场景:
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
)