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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
PHP模拟SQL Server的两个日期处理函数
Oct 09 PHP
生成sessionid和随机密码的例子
Oct 09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
php批量删除操作代码分享
Feb 26 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 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
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
面试常见的js算法题
2017/03/23 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
django之session与分页(实例讲解)
2017/11/13 Python
python多线程同步实例教程
2019/08/11 Python
python 实现多维数组(array)排序
2020/02/28 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
留学推荐信写作指南
2014/01/25 职场文书
业绩考核岗位职责
2014/02/01 职场文书
人事专员工作职责
2014/02/22 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
英语系本科生求职信
2014/07/15 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
女方离婚起诉书
2015/05/18 职场文书
结婚典礼主持词
2015/06/29 职场文书