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 日期时间函数的高级应用技巧
Oct 10 PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
Jan 06 PHP
php 启动报错如何解决
Jan 17 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
Mar 18 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/11 PHP
php模板之Phpbean的目录结构
2008/01/10 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
json对象转字符串如何实现
2012/12/02 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[01:31]完美与DOTA2历程
2014/07/31 DOTA
python实现的各种排序算法代码
2013/03/04 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
python字符串,数值计算
2016/10/05 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
python实现杨氏矩阵查找
2019/03/02 Python
python七夕浪漫表白源码
2019/04/05 Python
python英语单词测试小程序代码实例
2019/09/09 Python
python循环输出三角形图案的例子
2019/11/22 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
竞选班长演讲稿
2013/12/30 职场文书
小学教师师德反思
2014/02/03 职场文书
《手指教学》反思
2014/02/14 职场文书
学习标兵获奖感言
2014/02/20 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
运动会表扬稿范文
2015/05/05 职场文书
建国大业电影观后感
2015/06/01 职场文书
给numpy.array增加维度的超简单方法
2021/06/02 Python
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL