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 相关文章推荐
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
php 批量替换程序的具体实现代码
Oct 04 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
Jun 24 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
PHPCMS V9 添加二级导航的思路详解
Oct 20 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
PHP智能识别收货地址信息实例
Jan 05 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
20个PHP常用类库小结
2011/09/11 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
php的socket编程详解
2016/11/20 PHP
PHP中的正则表达式实例详解
2017/04/25 PHP
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
vuex分模块后,实现获取state的值
2020/07/26 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
python去除字符串中的换行符
2017/10/11 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
python实现微信打飞机游戏
2020/03/24 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
Python之多进程与多线程的使用
2021/02/23 Python
八一建军节活动方案
2014/02/10 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
李培根演讲稿
2014/05/22 职场文书
2014年财务部工作总结
2014/11/11 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
严以律己学习心得体会
2016/01/13 职场文书