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 5.0对象模型深度探索之绑定
Sep 05 PHP
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
为百度UE编辑器上传图片添加水印功能
Apr 16 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
Yii核心验证器api详解
Nov 23 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 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
ThinkPHP采用模块和操作分析
2011/04/18 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
python音频处理的示例详解
2020/12/23 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
在校学生职业规划范文
2014/01/08 职场文书
国庆节演讲稿
2014/05/27 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技