无限分类-迭代

本篇参考 无限极分类原理与实现

一开始只知道无限分类有递归和迭代,但是一直没有用到迭代,也不懂迭代原理。从网上找到这一篇 无限极分类原理与实现文章,让我大致上了解无限分类的迭代用法,加上 我自己的理解,写了本篇文章,因为文笔有限,见谅。希望留下您的宝贵意见。

描述:通过父级获得子类。

数据源:

$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],
];

流程:

  1. 将数组遍历,获得已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]
]
  1. 将原数组再次遍历,获得已 id 为键,原值不变的新数组B。
foreach($data as $v){
    $dataB[$v['id']] = $v;
}
  1. 设置3个新变量。
$tem = [$pid];   //栈
$son = [];  //盛放排序好的数组
$level = 0; //深度
  1. 重点:不知怎么描述。
循环(条件是判断$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--;
    }
}
  1. 得到排好序的数组$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;
}

你可能感兴趣的:(无限分类-迭代)