thinkphp5实现无限级分类


Posted in PHP onFebruary 18, 2019

tp5对分类数据表的信息读取与展示,我们即可以控制器完成,也可以在对应的模型中完成。本案例,我们在模型中完全成。况且,对数据表的增,删改查操作,本来就是模型的本职工作。

首先声明一下,我们采用递归的方式来实现无限分类。但无限分类的实现,不是只是递归一种方式,还有一种是全路径方式,也可以实现,不过,这种方式通常用在全路径导航菜单中。所以,这里我们还是用最常见的递归函数来实现:无限分类。

首先我们先创建一个静态方法:getCate,为什么要静态方式,因为静态方法执行效率高,不需要实例化,而且,分类查询是使用非常频繁的操作,很多查询都要依赖分类查询的结果。

当前的getCate方法,有三个参数:

第一个是$pid,是父类的id,默认为0,表示从顶级开始查起。

第二个参数是返回的查询结果,我们放在一个数组中返回,注意,这个变量是引入方式传入的。

在递归函数中,返回结果有三种方式:

第一种就是大家比较熟悉的,使用全局变量$_GLOBALS[],这个方法有副作用,我们不用它;

第二种方式也不错,是在函数中用static关键字,声明一个静态变量,它可以将每一次的递归执行结果进行累计,最后再返回,非常好理解,但占用资源过多,执行效率低;

第三种,就是采用引用参数的方式,来返回结果,这也是目前主流的技术。尽管理解起来有难度,但执行效率是最高的,我们要玩,就玩大的,所以这里,我们就直接采用引用,来返回查询结果。

第三个参数,可以没有,它是用来设置一下分类之间的层次显示的,可以让结果看上去更直观清晰。

<?php
 
namespace app\admin\model;
 
use think\Collection;
use think\Model;
 
class Category extends Model
{
 //创建一个静态方法getCate,来获取分类信息
 
 /**
  * @param int $pid: 当前分类的父id
  * @param array $result:引用返回值
  * @param int $blank:设置分类之间的显示提示
  */
 public static function getCate($pid=0, &$result=[], $blank=0)
 {
  //1.分类表查询:$pid
  $res = self::all(['pid'=>$pid]);
 
  //2.自定义分类名称前面的提示信息
  $blank += 2;
 
  //3.遍历分类表
  foreach ($res as $key => $value) {
 
   //3-1自定义分类名称的显示格式
   $cate_name = '|--'.$value->cate_name;
   $value->cate_name = str_repeat(' ',$blank).$cate_name;
 
   //3-2将查询到的当前记录保存到结果$result中
   $result[] = $value;
 
   //3-3关键:将当前记录的id,做为下一级分类的父id,$pid,继续递归调用本方法
   self::getCate($value->id, $result, $blank);
  }
 
  //4.返回查询结果,调用结果集类make方法打包当前结果,转为二维数组返回
  return Collection::make($result)->toArray();
 }
}

控制器中调用代码:

public function edit(Request $request)
{
 //1.获取一下分类id
 $cate_id = $request -> param('id');
 
 //2.查询要更新的数据
 $cate_now = CategoryModel::get($cate_id);
 
 //3.递归查询所有的分类信息
 $cate_level = CategoryModel::getCate();
 
 //4.模板赋值
 $this -> view -> assign('cate_now', $cate_now);
 $this -> view -> assign('cate_level', $cate_level);
 
 
 //5.渲染模板
 return $this -> view -> fetch('category_edit');
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php实现的简单压缩英文字符串的代码
Apr 24 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
Nov 07 PHP
php线性表顺序存储实现代码(增删查改)
Feb 16 PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
php实现倒计时效果
Dec 19 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
PHP获取文件扩展名的方法实例总结
Jun 10 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
php实现文章评论系统
Feb 18 #PHP
php无限级分类实现评论及回复功能
Feb 18 #PHP
PHP-FPM 的管理和配置详解
Feb 17 #PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 #PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 #PHP
PHP封装的mysqli数据库操作类示例
Feb 16 #PHP
PHP fprintf()函数用法讲解
Feb 16 #PHP
You might like
curl 出现错误的调试方法(必看)
2017/02/13 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
Python拼接字符串的7种方法总结
2018/11/01 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
浅谈python锁与死锁问题
2020/08/14 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
应届生污水处理求职信
2013/11/06 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
采购意向书范本
2014/03/31 职场文书
社区义诊活动总结
2014/04/30 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
培训后的感想
2015/08/07 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技