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 htmlentities和htmlspecialchars 的区别
Aug 18 PHP
PHP 开源框架22个简单简介
Aug 24 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
May 09 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
Dec 16 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
PHP getName()函数讲解
Feb 03 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
laravel ajax curd 搜索登录判断功能的实现
Apr 17 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
购物车实现的几种方式优缺点对比
2018/05/02 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
python的Jenkins接口调用方式
2020/05/12 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
python利用opencv实现颜色检测
2021/02/23 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
帕克纽约:PARKER NY
2018/12/09 全球购物
大学四年的个人自我评价
2014/01/14 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
个人年终总结结尾
2015/03/06 职场文书
撤诉申请怎么写
2015/05/19 职场文书
初中地理教学反思
2016/02/19 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书