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中的多态性[译]
Aug 02 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
php实现获取及设置用户访问页面语言类
Sep 24 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
PHP中使用php://input处理相同name值的表单数据
Feb 03 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
Sep 22 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
使用laravel的migrate创建数据表的方法
Sep 30 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 PHP
微信小程序和php的登录实现
Apr 01 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
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
json 入门基础教程 推荐
2009/10/31 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
python属于跨平台语言码
2020/06/09 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
给海归自荐信的建议
2013/12/13 职场文书
电气工程和自动化自荐信范文
2013/12/25 职场文书
廉洁校园实施方案
2014/05/25 职场文书
学校开除通知书
2015/04/25 职场文书
建筑工程催款函
2015/06/24 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
导游词之临安白水涧
2019/11/05 职场文书