说到无限极分类,比较常见的做法是在建表的时候,增加一个parnet_id字段用来区别自己所属的分类(是顶级分类还是子分类)

由于展示数据的时候,需要表达出这种所属关系,所以必然要在读取数据的时候进行一系列处理,由此就牵涉到了两种算法

看下未无限极分类之前的数据结构如下(假设这个数组叫$data):array (size=6)

0 =>

array (size=4)

'cat_id' => int 7

'cname' => string 'php' (length=3)

'is_show' => int 1

'parent_id' => int 80

1 =>

array (size=4)

'cat_id' => int 6

'cname' => string 'mysql' (length=5)

'is_show' => int 1

'parent_id' => int 80

2 =>

array (size=4)

'cat_id' => int 74

'cname' => string 'Linux' (length=5)

'is_show' => int 1

'parent_id' => int 80

3 =>

array (size=4)

'cat_id' => int 80

'cname' => string '软件开发' (length=12)

'is_show' => int 1

'parent_id' => int 0

4 =>

array (size=4)

'cat_id' => int 87

'cname' => string '生活随笔' (length=12)

'is_show' => int 1

'parent_id' => int 0

5 =>

array (size=4)

'cat_id' => int 94

'cname' => string '邻居' (length=6)

'is_show' => int 1

'parent_id' => int 0

一、巧妙的引用算法

由于众所周知的原因,递归对资源的消耗是非常大的,实际执行起来效率也很低,所以有了下面的通过引用算法

上代码:/**

* 无限极分类(引用方式)

*@param  array $data需要分类的数组

*@return array 返回一个已经无限极分类完成的数组

*/

function getTree($data)

{

$items = array();

//构建一个新的数组 新数组的key值是自己的主键id值(我这里表的主键是cat_id)

//为何要构建这样一个数组 这就是和下面第二个foreach有关了,看了代码后就会明白何为巧妙引用了

foreach($data as $v)

{

$items[$v['cat_id']] = $v;

}

$tree = array();

//将数据进行无限极分类

foreach($items as $key => $val)

{

if(isset($items[$val['parent_id']]))

{

//关键是看这个判断,是顶级分类就给$tree,不是的话继续拼凑子分类(结合上述&用法)

$items[ $val['parent_id'] ] ['child'] [] = &$items[$key];

}

else

{

$tree[] = &$items[$key];

}

}

//返回无限极分类后的数据

return $tree;

}

上面代码中第一个foreach之后 $items数组变成如下结构:array (size=6)

7 =>

array (size=4)

'cat_id' => int 7

'cname' => string 'php' (length=3)

'is_show' => int 1

'parent_id' => int 80

6 =>

array (size=4)

'cat_id' => int 6

'cname' => string 'mysql' (length=5)

'is_show' => int 1

'parent_id' => int 80

74 =>

array (size=4)

'cat_id' => int 74

'cname' => string 'Linux' (length=5)

'is_show' => int 1

'parent_id' => int 80

80 =>

array (size=4)

'cat_id' => int 80

'cname' => string '软件开发' (length=12)

'is_show' => int 1

'parent_id' => int 0

87 =>

array (size=4)

'cat_id' => int 87

'cname' => string '生活随笔' (length=12)

'is_show' => int 1

'parent_id' => int 0

94 =>

array (size=4)

'cat_id' => int 94

'cname' => string '邻居' (length=6)

'is_show' => int 1

'parent_id' => int 0

第二个foreach之后 $tree数组变成如下结构:array (size=3)

0 =>

array (size=5)

'cat_id' => int 80

'cname' => string '软件开发' (length=12)

'is_show' => int 1

'parent_id' => int 0

'child' =>

array (size=3)

0 =>

array (size=4)

'cat_id' => int 7

'cname' => string 'php' (length=3)

'is_show' => int 1

'parent_id' => int 80

1 =>

array (size=4)

'cat_id' => int 6

'cname' => string 'mysql' (length=5)

'is_show' => int 1

'parent_id' => int 80

2 =>

array (size=4)

'cat_id' => int 74

'cname' => string 'Linux' (length=5)

'is_show' => int 1

'parent_id' => int 80

1 =>

array (size=4)

'cat_id' => int 87

'cname' => string '生活随笔' (length=12)

'is_show' => int 1

'parent_id' => int 0

2 =>

array (size=4)

'cat_id' => int 94

'cname' => string '邻居' (length=6)

'is_show' => int 1

'parent_id' => int 0

二、国民级算法-递归

从数据库取得二维数组省略,递归的思路其实很简单,遍历数组,根据每条数据的id值去寻找所有parent_id值等于自己id值的数据,直到找不到为止。

好了 上代码:/**

* 无限极分类(递归方式)

*@param  array $categoryies 需要分类的数组

*@param  int   $parent_id   需要查询的顶级分类id,默认为0 表示顶级分类

*@param  int   $level       默认0 表示是顶级分类  增加无限极分类的层级标识 用于在模板显示缩进层级关系

*@return  array 返回一个已经无限极分类完成的数组

*/

function limit_category($categoryies, $parent_id = 0, $level = 0)

{

//定义一个静态数组 用于保存每次遍历得到的结果

static $res = [];

//遍历数组 进行数据判断

foreach($categoryies as $key => $val)

{

if($val['parent_id'] == $parent_id)

{

$val['level'] = $level;

//是要找的父级分类内容

$res[] = $val;

//递归点 当前分类有可能有子分类

limit_category($categoryies, $val['cat_id'], $level + 1); //注意这里是cat_id不是parent_id !!

}

}

return $res;

}

//调用:

limit_category($data);

最后返回的数组结构如下:array (size=6)

0 =>

array (size=5)

'cat_id' => int 80

'cname' => string '软件开发' (length=12)

'is_show' => int 1

'parent_id' => int 0

'level' => int 0

1 =>

array (size=5)

'cat_id' => int 7

'cname' => string 'php' (length=3)

'is_show' => int 1

'parent_id' => int 80

'level' => int 1

2 =>

array (size=5)

'cat_id' => int 6

'cname' => string 'mysql' (length=5)

'is_show' => int 1

'parent_id' => int 80

'level' => int 1

3 =>

array (size=5)

'cat_id' => int 74

'cname' => string 'Linux' (length=5)

'is_show' => int 1

'parent_id' => int 80

'level' => int 1

4 =>

array (size=5)

'cat_id' => int 87

'cname' => string '生活随笔' (length=12)

'is_show' => int 1

'parent_id' => int 0

'level' => int 0

5 =>

array (size=5)

'cat_id' => int 94

'cname' => string '邻居' (length=6)

'is_show' => int 1

'parent_id' => int 0

'level' => int 0

数据量不大的话 两种方式执行起来速度相差无几,数据量大的话,引用方式秒杀递归方式,无论是从性能速度还是内存占用空间大小

推荐一个参考网址吧:

https://blog.csdn.net/falcom_fans/article/details/75579663

冒泡排序,选择排序,插入排序,快速排序,堆排序,归并排序,希尔排序,桶排序,基数排序新年帮您排忧解难。

有向图,无向图,有环图,无环图,完全图,稠密图,稀疏图,拓扑图祝您新年宏图大展。

最长路,最短路,单源路径,所有节点对路径祝您新年路路通畅。

二叉树,红黑树,van Emde Boas树,最小生成树祝您新年好运枝繁叶茂。

最大流,网络流,标准输入流,标准输出流,文件输入流,文件输出流祝您新年顺顺流流。

线性动规,区间动规,坐标动规,背包动规,树型动归为您的新年规划精彩。

散列表,哈希表,邻接表,双向链表,循环链表帮您在新年表达喜悦。

O(1), O(log n), O(n), O(nlog n), O(n^2), O(n^3), O(2^n), O(n!)祝大家新年渐进步步高。

php 递归实现无限极分类和排序_无限极分类的两种方式,递归和引用相关推荐

  1. java json 对象如何对属性排序_Java对象集合、对象数组如何排序?你需要知道这两种方式...

    一.引子 在比较Java对象时,正常情况下,我们只能使用==或!=进行比较,而不能使用>或者<这样的运算符. 那么问题来了,开发过程中我们经常要对多个对象排序,排序必然需要比较,那么如何实 ...

  2. java遍历文件夹的两种方式(递归和非递归)

    非递归方式(有点类似二叉树的非递归遍历,采用链表来存储遍历到的文件夹,如果是文件就直接输出) public void traverseFile(String path){File[] fileArra ...

  3. 分类与数值预测是预测问题的两种主要类型

    分类与数值预测是预测问题的两种主要类型

  4. python3解释器执行not 1 and 1_编程语言的分类,python解释器多版本共存.执行python的两种方式,变量,用户与程序交互...

    一.编程语言的分类? 机器语言:直接使用二进制指令编程,直接操作硬件,必须考虑硬件细节. 汇编语言:用简写的英文标识符取代二进制去编写程序,直接操作硬件,必须考虑硬件细节. 高级语言:通过人类能够理解 ...

  5. python去重复排序_Python实现删除排序数组中重复项的两种方法示例

    本文实例讲述了Python实现删除排序数组中重复项的两种方法.分享给大家供大家参考,具体如下: 对于给定的有序数组nums,移除数组中存在的重复数字,确保每个数字只出现一次并返回新数组的长度 注意:不 ...

  6. js通过两种方式进行对商品价格排序

    javascript-illustration.png js通过两种方式进行对商品价格排序 <template><div class="content">& ...

  7. 第四周作业——统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

    统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现) 方法一:grep实现 grep -o "\<[[:alpha:]] ...

  8. php 无限极分销,PHP实现无限极分类的两种方式

    无限极分类说简单点就是一个类可以分成一个分子类,然后一个子类又可以分另一个子类这样无限分下去,就是好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一个文件夹,PHP要实现无限极分类有两 ...

  9. xtragrid 某个值 查找_Java 经典算法:二分法查找(循环和递归两种方式实现)

    一.二分法查找简介 当数组或者集合中存放的元素数量非常多的时候,想要跟踪具体某个元素的位置或者是否存在,常规方式是循环每一个元素直到找到要查找的元素为止.这样的查找方式效率非常低下,这个时候需要使用二 ...

最新文章

  1. 开发部署提速8倍!这款IDE插件了解一下?
  2. php单引号双引号的区别
  3. ajax 导出文件给 文件重新命名_Tanner LEdit 05 | 导出GDSII文件
  4. Linux安装composer出现usr/bin/env: php: No such file or directory)
  5. amd一点也不yes_A粉的狂欢,AMD显卡也翻身了,3A平台不再是笑话了,AMD YES!
  6. Leetcode--17.电话号码的字母组合
  7. Nginx 的常用命令
  8. C#中的三层前馈神经网络,带有图形显示
  9. grDevices | R语言中的配色方法汇总(Ⅱ-2)
  10. 循环链表--约瑟夫问题
  11. maven-compiler-plugin的理解
  12. 考研初试将近,收好这份准备清单,祝你一战成硕
  13. arcgis的numpy模块_01. Numpy模块
  14. 一次数据库的简单性能优化
  15. php易语言互交_易语言php编码转换 易语言与php数据交互
  16. 网络分析工具-Mtr
  17. (边学边练)JAVA基础学习第三天
  18. 今天跟好朋友的一段超长爆笑聊天记录(Space搬家)
  19. 接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结果。
  20. js组件化、模块化开发

热门文章

  1. 视频问答PPT大放送丨中信银行邓琼-GoldenDB分布式数据库研发与应用实践
  2. 2019年9月数据库流行度排行:MySQL 强劲增长完成深 V 反转
  3. stm32串口空闲中断接收不定长数据
  4. 三问三答,解传统企业敏捷转型担忧
  5. “DNAT+云链接+CDN”加速方案,助力出海企业落地生长
  6. 【Python3网络爬虫开发实战】 1.5.4-RedisDump的安装
  7. mysql count 1_高性能MySQL count(1)与count(*)的差别
  8. gradle命令无法识别
  9. java 调用命令行
  10. 如何读取tensorboard文件 展现可视化