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 相关文章推荐
模拟flock实现文件锁定
Feb 14 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
PHP创建/删除/复制文件夹、文件
May 03 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
PHP中危险的file_put_contents函数详解
Nov 04 PHP
PHP中递归的实现实例详解
Nov 14 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 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水印
2007/03/16 PHP
PHP与SQL注入攻击[二]
2007/04/17 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
JavaScript中防止微信浏览器被整体拖动的方法
2017/08/25 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Python谱减法语音降噪实例
2019/12/18 Python
python中def是做什么的
2020/06/10 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
地理教师岗位职责
2014/03/16 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers