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 相关文章推荐
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
php 正则匹配函数体
Aug 25 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
php数组去重实例及分析
Nov 26 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
php解析base64数据生成图片的方法
Dec 06 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
基于laravel Request的所有方法详解
Sep 29 PHP
Laravel 创建可以传递参数 Console服务的例子
Oct 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
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
javascript时间差插件分享
2016/07/18 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
详解python深浅拷贝区别
2019/06/24 Python
python实现PCA降维的示例详解
2020/02/24 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
一套VC试题
2015/01/23 面试题
linux面试题参考答案(10)
2016/10/26 面试题
应用艺术毕业生的自我评价
2013/12/04 职场文书
旅游管理专业个人求职信范文
2013/12/24 职场文书
迎国庆演讲稿
2014/09/05 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
欢送会主持词
2015/07/01 职场文书
2016十一国庆节感言
2015/12/09 职场文书