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 相关文章推荐
漂亮但不安全的CTB
Oct 09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
Apr 03 PHP
php修改时间格式的代码
May 29 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
PHP在线书签系统分享
Jan 04 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
php查询内存信息操作示例
May 09 PHP
PHP变量的作用范围实例讲解
Dec 22 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php旋转图片90度的方法
2013/11/07 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
js实现楼层导航功能
2017/02/23 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
python交换两个变量的值方法
2019/01/12 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
python cumsum函数的具体使用
2019/07/29 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
python音频处理的示例详解
2020/12/23 Python
python实现KNN近邻算法
2020/12/30 Python
简述数据库的设计过程
2015/06/22 面试题
高中三年学习生活的自我评价
2013/10/10 职场文书
会计系中文个人求职信
2013/12/24 职场文书
企业金融服务方案
2014/06/03 职场文书
健康证明
2015/06/19 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL