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中使用Oracle数据库(2)
Oct 09 PHP
php中的登陆login
Jan 18 PHP
php 购物车实例(申精)
May 11 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
Nov 12 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
php生成图片缩略图的方法
Apr 07 PHP
php操作memcache缓存方法分享
Jun 03 PHP
PHP简单计算两个时间差的方法示例
Jun 20 PHP
PHP构造二叉树算法示例
Jun 21 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 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
基于PHP的加载类操作以及其他两种魔术方法的应用实例
Aug 28 #PHP
You might like
用在PHP里的JS打印函数
2006/10/09 PHP
基于mysql的bbs设计(一)
2006/10/09 PHP
php中文验证码实现方法
2015/06/18 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
python+OpenCV实现图像拼接
2020/03/05 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
最新个人职业生涯规划书
2014/01/22 职场文书
鲜花方阵解说词
2014/02/13 职场文书
担保书格式及范文
2014/04/01 职场文书
学校捐款活动总结
2015/05/09 职场文书
超市员工辞职信范文
2015/05/12 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
goland 恢复已更改文件的操作
2021/04/28 Golang
Flask搭建一个API服务器的步骤
2021/05/28 Python