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获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
php常见的魔术方法详解
Dec 25 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
PHP使用递归算法无限遍历数组示例
Jan 13 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 PHP
php实现对文件压缩简单的方法
Sep 29 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 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的安全策略
2006/10/09 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
Array of country list in PHP with Zend Framework
2011/10/17 PHP
深入apache host的配置详解
2013/06/09 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python的id()函数介绍
2013/02/10 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
python的依赖管理的实现
2019/05/14 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
自荐信格式的六要素
2013/09/21 职场文书
装潢设计专业推荐信模板
2013/11/26 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
团组织关系介绍信
2014/01/12 职场文书
学校三节实施方案
2014/06/09 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
2015年重阳节主持词
2015/07/04 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL