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 和 MySQL 基础教程(二)
Oct 09 PHP
需要发散思维学习PHP
Jun 29 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
yii操作cookie实例简介
Jul 09 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
PHP获取数组的键与值方法小结
Jun 13 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
php如何把表单内容提交到数据库
Jul 08 PHP
laravel通用化的CURD的实现
Dec 13 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
PHP array_push 数组函数
2009/12/26 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
python中函数总结之装饰器闭包详解
2016/06/12 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
python 进程的几种创建方式详解
2019/08/29 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
python相对企业语言优势在哪
2020/06/12 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
.net软件工程师面试题
2015/03/31 面试题
运动会广播稿200字
2014/01/15 职场文书
初三学生评语大全
2014/04/24 职场文书
班级旅游计划书
2014/05/03 职场文书
维修工先进事迹
2014/05/29 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
通知的写法
2015/04/23 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书