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

无限分类-迭代

作者: 奇语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;
    }
    

    相关文章

      网友评论

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

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