zoukankan      html  css  js  c++  java
  • PHP迭代与递归实现无限级分类

    无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.

    1.循环迭代实现

    复制代码
     1 $arr = [
     2     1=>['id'=>1,'name'=>'父1','father'=>NULL],
     3     2=>['id'=>2,'name'=>'父2','father'=>NULL],
     4     3=>['id'=>3,'name'=>'父3','father'=>NULL],
     5     4=>['id'=>4,'name'=>'儿1-1','father'=>1],
     6     5=>['id'=>5,'name'=>'儿1-2','father'=>1],
     7     6=>['id'=>6,'name'=>'儿1-3','father'=>1],
     8     7=>['id'=>7,'name'=>'儿2-1','father'=>2],
     9     8=>['id'=>8,'name'=>'儿2-1','father'=>2],
    10     9=>['id'=>9,'name'=>'儿3-1','father'=>3],
    11     10=>['id'=>10,'name'=>'儿3-1-1','father'=>9],
    12     11=>['id'=>11,'name'=>'儿1-1-1','father'=>4],
    13     12=>['id'=>12,'name'=>'儿2-1-1','father'=>7],
    14 ];
    15 function generateTree($items){
    16     $tree = array();
    17     foreach($items as $item){
    18         if(isset($items[$item['father']])){
    19             $items[$item['father']]['son'][] = &$items[$item['id']]; 
    20         }else{
    21             $tree[] = &$items[$item['id']];
    22         }
    23     }
    24     return $tree;
    25 }
    26 $tree = generateTree($arr);
    27 print_r(json_encode($tree));
    复制代码

    输出:

    分析:

    这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.

    优点:速度快,效率高.

    缺点:数组的key值必须与id值相同,不便于取出数据(使用递归获取数据)

    2.递归实现

    复制代码
    $arr = [
        0=>['id'=>1,'name'=>'父1','father'=>0],
        1=>['id'=>2,'name'=>'父2','father'=>0],
        2=>['id'=>3,'name'=>'父3','father'=>0],
        3=>['id'=>4,'name'=>'儿1-1','father'=>1],
        4=>['id'=>5,'name'=>'儿1-2','father'=>1],
        5=>['id'=>6,'name'=>'儿1-3','father'=>1],
        6=>['id'=>7,'name'=>'儿2-1','father'=>2],
        7=>['id'=>8,'name'=>'儿2-1','father'=>2],
        8=>['id'=>9,'name'=>'儿3-1','father'=>3],
        9=>['id'=>10,'name'=>'儿3-1-1','father'=>9],
        10=>['id'=>11,'name'=>'儿1-1-1','father'=>4],
        11=>['id'=>12,'name'=>'儿2-1-1','father'=>7],
    ];
    function generateTree($arr,$id,$step){
        static $tree=[];
        foreach($arr as $key=>$val) {
            if($val['father'] == $id) {
                $flg = str_repeat('└―',$step);
                $val['name'] = $flg.$val['name'];
                $tree[] = $val;
                generateTree($arr , $val['id'] ,$step+1);
            }
        }
        return $tree;
    }
    $tree = generateTree($arr,0,0);
    foreach ($tree as $val){
        echo $val['name'].'<br>';
    }
    复制代码

     输出:

    分析:


    利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组

    优点:方便遍历,查找父子元素

    缺点:php不擅长递归,数据量大的情况下效率会显著降低

  • 相关阅读:
    Linux实战教学笔记14:用户管理初级(上)
    上传文件到服务器指定位置 & 从服务器指定位置下载文件
    flume读取日志文件并存储到HDFS
    Kafka
    Eclipse获取工作空间跟运行空间
    Java开发webservice的几种方式
    获取.properties配置文件属性值
    数组合并
    字符串对象跟xml格式的转换
    文件压缩跟解压(本地&Linux服务器)
  • 原文地址:https://www.cnblogs.com/shenzikun1314/p/7467148.html
Copyright © 2011-2022 走看看