无限分类-迭代
2018-10-18 本文已影响0人
奇语ms
本篇参考 无限极分类原理与实现
一开始只知道无限分类有递归和迭代,但是一直没有用到迭代,也不懂迭代原理。从网上找到这一篇 无限极分类原理与实现文章,让我大致上了解无限分类的迭代用法,加上 我自己的理解,写了本篇文章,因为文笔有限,见谅。希望留下您的宝贵意见。
描述:通过父级获得子类。
数据源:
$a = [
['id'=>1,'pid'=>2],
['id'=>2,'pid'=>0],
['id'=>3,'pid'=>1],
['id'=>4,'pid'=>2],
['id'=>5,'pid'=>0],
['id'=>6,'pid'=>1],
['id'=>7,'pid'=>3],
['id'=>8,'pid'=>9],
['id'=>9,'pid'=>6],
['id'=>10,'pid'=>4],
['id'=>11,'pid'=>5],
['id'=>12,'pid'=>4],
['id'=>13,'pid'=>7],
['id'=>14,'pid'=>8],
];
流程:
- 将数组遍历,获得已pid 为键,id集合的数组为值得二维数组A。
foreach ($data as $v){
$dataA[$v['pid']][] = $v['id'];
}
获得数组格式为:
[
2 => [1,4],
0 => [2,5],
1 => [3,6],
3 => [7],
9 => [8],
6 => [9],
4 => [10,12],
5 => [11],
7 => [13],
8 => [14]
]
- 将原数组再次遍历,获得已 id 为键,原值不变的新数组B。
foreach($data as $v){
$dataB[$v['id']] = $v;
}
- 设置3个新变量。
$tem = [$pid]; //栈
$son = []; //盛放排序好的数组
$level = 0; //深度
- 重点:不知怎么描述。
循环(条件是判断$tem 是否是空数组),{
判断(在数组A中查看键为pid的值是否存在或为空数组(不存在或为空数组简称为空))
为空:
去除$tem 的最后一个值之后,令pid 等于$tem的最后一个值;
深度值减一;
不为空:
令pid等于数组A中键为pid的值中的第一个元素,并删除这个第一个元素;
深度值加一;
找到数组B中键为pid的值,向里面添加深度,并将此值添加到 数组$son中
向数组$tem中添加pid 的值。
}
while(!empty($tem)){
if(!empty($dataA[$pid])){
$pid = array_shift($dataA[$pid]);
$level++;
$dataB[$pid]['level'] = $level;
$son[] = $dataB[$pid];
$tem[] = $pid;
unset($dataB[$pid]);
}else{
array_pop($tem);
$pid = end($tem);
$level--;
}
}
- 得到排好序的数组$son
函数:
function parentSort($data,$pid){
$tem = [$pid]; //栈
$son = [];
$level = 0; //深度
$dataA = [];
$dataB = [];
foreach ($data as $v){
$dataA[$v['pid']][] = $v['id'];
}
foreach($data as $v){
$dataB[$v['id']] = $v;
}
// unset($data);
while(!empty($tem)){
if(!empty($dataA[$pid])){
$pid = array_shift($dataA[$pid]);
$level++;
$dataB[$pid]['level'] = $level;
$son[] = $dataB[$pid];
$tem[] = $pid;
//unset($dataB[$pid]);
}else{
array_pop($tem);
$pid = end($tem);
$level--;
}
}
return $son;
}