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


Posted in PHP onAugust 28, 2017

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

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));

输出:

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

分析:

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

优点:速度快,效率高.

缺点:数组的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>';
}

 输出:

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

分析:

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

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

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

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

PHP 相关文章推荐
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
PHP文件注释标记及规范小结
Apr 01 PHP
深入理解PHP中的global
Aug 19 PHP
thinkphp普通查询与表达式查询实例分析
Nov 24 PHP
PHP查询附近的人及其距离的实现方法
May 11 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 PHP
PHP数组去重的更快实现方式分析
May 09 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
Dec 04 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 #PHP
PHP大文件分割上传 PHP分片上传
Aug 28 #PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 #PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 #PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 #PHP
php检查函数必传参数是否存在的实例详解
Aug 28 #PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 #PHP
You might like
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
初识ThinkPHP控制器
2016/04/07 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
少女风vue组件库的制作全过程
2019/05/15 Javascript
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
python 基于opencv操作摄像头
2020/12/24 Python
农民工预备党员思想汇报
2014/09/14 职场文书
销售员岗位职责
2015/02/10 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
python套接字socket通信
2022/04/01 Python
SQL Server 中的事务介绍
2022/05/20 SQL Server