美文网首页
无限分类-迭代

无限分类-迭代

作者: 奇语ms | 来源:发表于2018-10-18 11:19 被阅读0次

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

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

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

数据源:

$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;
}

相关文章

  • 无限分类-迭代

    本篇参考 无限极分类原理与实现 一开始只知道无限分类有递归和迭代,但是一直没有用到迭代,也不懂迭代原理。从网上找到...

  • PHP 无限极分类

    1.循环迭代实现无限极分类 输出结果如下: 分析:这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算...

  • 无限分类

    这是一个二级分类 怎么遍历出这个二级分类 利用递归 public static function getLei($...

  • 无限级分类,子孙树的递归与迭代

    ``` $area = array( array('id'=>1,'area'=>'北京','pid'=>0), ...

  • STL与泛型编程 Week4 (Boolan) by Im4li

    1-算法的形式低耦合的function template2-迭代器的分类(catagory) 3-迭代器分类(ca...

  • C++笔记九(STL与泛型编程)

    本周内容(1)迭代器的分类(category)(2)迭代器分类对算法的影响(3)STL算法(4)仿函数/函数对象(...

  • 无限迭代器

    for i from 1 to Mfor j from i to Mfor k from j to Mfor l ...

  • Python模块---itertools操作迭代对象

    itertools操作迭代对象 count()无限迭代器 itertools.count(start=0, ste...

  • 2018-12-10

    复习无限级分类

  • 无限级分类

    1.有两种实现方式:a.递归方式,b.迭代方式; a.递归方式:(实现家谱树和子孙树) 家谱树: /** ...

网友评论

      本文标题:无限分类-迭代

      本文链接:https://www.haomeiwen.com/subject/tvdjzftx.html