侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP迭代与递归实现无限级分类

php  /  管理员 发布于 7年前   487

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

1.循环迭代实现

$arr = [  1=>['id'=>1,'name'=>'父1','father'=>NULL],  2=>['id'=>2,'name'=>'父2','father'=>NULL],  3=>['id'=>3,'name'=>'父3','father'=>NULL],  4=>['id'=>4,'name'=>'儿1-1','father'=>1],  5=>['id'=>5,'name'=>'儿1-2','father'=>1],  6=>['id'=>6,'name'=>'儿1-3','father'=>1],  7=>['id'=>7,'name'=>'儿2-1','father'=>2],  8=>['id'=>8,'name'=>'儿2-1','father'=>2],  9=>['id'=>9,'name'=>'儿3-1','father'=>3],  10=>['id'=>10,'name'=>'儿3-1-1','father'=>9],  11=>['id'=>11,'name'=>'儿1-1-1','father'=>4],  12=>['id'=>12,'name'=>'儿2-1-1','father'=>7],];function generateTree($items){  $tree = array();  foreach($items as $item){    if(isset($items[$item['father']])){      $items[$item['father']]['son'][] = &$items[$item['id']];     }else{      $tree[] = &$items[$item['id']];    }  }  return $tree;}$tree = generateTree($arr);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('└D',$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'].'
';}

 输出:

分析:

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:

  • PHP迭代器接口Iterator用法分析
  • PHP迭代器的内部执行过程详解
  • php使用递归与迭代实现快速排序示例
  • PHP迭代器实现斐波纳契数列的函数
  • PHP设计模式之迭代器模式
  • PHP中的Iterator迭代对象属性详解


  • 上一条:
    PHP单例模式与工厂模式详解
    下一条:
    PHP大文件分割上传 PHP分片上传
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客