PHP无限递归菜单的实现流程

简介:

这几天看到TP里关于无线分类搞得蛮火的,各种代码乱飞。我也发布一个我的思路。使用的是递归,代码很简洁,十行左右。
我的数据库结构是这样的,我的栏目只有一张表。

cid    fatherid    name
主键   父栏目标识   名称

我看到,很多教程里说使用类似0-1-2-3这样的路径法,还有lv=3的层次法,其实大致都一样,只是实现的方式不同而已。我的方法使用的是递归,也比较好理解。


直接上代码了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//首先做一个类内的变量,存储一下相关的数组:
  public  $tree  = null;
  //然后做个测试方法,用于输出结果
  public  function  test() {
         $res  = M( 'channel' )->where( 'fatherid is null' )->select();
         $this ->createtree( $res );
         dump( $this ->tree);
  }
  //这里是递归方法
  private  function  createtree( array  $data  = null,  $lv  = 1) {
         for  ( $i  = 0;  $i  count ( $data );  $i ++) {
             $data [ $i ][ 'lv' ] =  $lv ;
             $this ->tree[ count ( $this ->tree)] =  $data [ $i ];
             $res  = M( 'channel' )->where( 'fatherid=' . $data [ $i ][ 'cid' ])->select();
             $this ->createtree( $res , ( $lv  + 1));
         }
  }


这里要说明一下,我的数据库中的结构是,如果一个栏目为顶级栏目(没有父栏目)的话,他的fatherid等于null的,而不是0,此处和别人的案例不一样,因为我有一些外键,会使用到关联模型,所以没有使用0作为顶级分类标识。

思路大致是这样,将所有的顶级栏目找出来,然后开始递归,在递归的过程中,将层级关系写入数组子元素中,这样比较便于理解和使用。

然后将该行记录作为数组的最后一个元素插入。

再去查询,当前递归的栏目,是否还有子栏目,如果有则继续发给递归方法去循环,这里没有判断子栏目返回值是否大于0,因为如果返回的是null,则不会开始循环,请注意递归方法的开头FOR循环。

最后的结果出来就是一个多维数组,每行记录作为一个子元素,并且,顶级栏目的后面跟随着他的所有子栏目。

如果你需要对分类顺序进行排列,可以使用order,不会有影响的。

有人可能会问,这样做会不会产生效率问题,我个人觉得,现在的分类说是无限级,其实不过是为了表达对层级关系的概念,不会有那个网站真分几千个栏目的,起码中国没有。通常来说,200个栏目以内,属于正常,这个代码,就是性能再差,200个栏目的递归都搞不定?如果你觉得慢了或者对性能有严重影响,还可以考虑使用缓存,这样一次使用,周期内都受益的,毕竟栏目不会每小时变一次吧?










本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1216069,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
安全 关系型数据库 MySQL
PHP手术麻醉临床信息管理系统源码 术前、术中、术后全流程管理
麻醉文书是用于管理患者手术全过程的文书。 麻醉同意:医院麻醉知情同意书的填写和编辑; 病案查询:可以通过搜索框搜索患者查询病案; 申请手术:手术申请单的填写和打印; 风险评估:医院手术风险评估表的书写和编辑。
39 0
|
7月前
|
关系型数据库 MySQL 应用服务中间件
Mac PHP-Nginx-Mysql 本地开发日常启动流程
Mac PHP-Nginx-Mysql 本地开发日常启动流程
40 1
|
PHP 开发工具
PHP对接苹果支付全流程
PHP对接苹果支付全流程
747 0
PHP对接苹果支付全流程
|
4月前
|
安全 关系型数据库 MySQL
【PHP】医院HIS手术麻醉临床信息管理系统源码 实现术前、术中、术后全流程管理
【PHP】医院HIS手术麻醉临床信息管理系统源码 实现术前、术中、术后全流程管理
49 0
|
4月前
|
算法 小程序 PHP
PHP实现递归排序
在leetcode练习算法的时候,发现一个算法需要用到递归。 递归是个好东西,但是吧,一般不理解其精髓的,很难写出一个好的递归。 递归其实就是函数本身直接或者间接地调用自身的一种编程方法(我自己调用我自己~),也可以理解为有反复执行过程的一种方法,这个就与循环非常相似,但是递归调用的函数中必须要有终止条件,也就是一定
28 1
|
6月前
|
前端开发 JavaScript API
php的短信验证的流程,如何实现前端js加后端php
php的短信验证的流程,如何实现前端js加后端php
|
10月前
|
PHP
PHP递归和循环的速度测试
写了一个可以对 $_GET`, `$_POST 等输入进行过滤的函数,做了PHP递归和循环的速度测试。
55 0
|
10月前
|
SQL 算法 IDE
【web 开发基础】PHP 中的特殊流程控制(exit) -PHP 快速入门 (22)
当前的脚本中只要执行到exit语句,无论它是在哪个结构中,都会直接退出当前脚本。exit()是一个函数,exit()是die()函数的别名,它可以带有一个参数输出一条消息作为提示,并退出当前脚本。比如:我们通常在连接数据库、选择数据库,以及执行SQL语句中如果有失败的环节,则可以使用3种方式输出错误消息,并退出脚本。
71 0
|
11月前
|
SQL Web App开发 设计模式
PHP代码审计系列(一) 基础:方法、思路、流程
PHP代码审计系列(一) 基础:方法、思路、流程
357 0