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开启安全模式后禁用的函数集合
Jun 26 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
php二维数组排序方法(array_multisort usort)
Dec 25 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
Yii2 批量插入、更新数据实例
Mar 15 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
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP图片加水印实现方法
2016/05/06 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
常用js字符串判断方法整理
2013/10/18 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
Python中的包和模块实例
2014/11/22 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
财务与信息服务专业推荐信
2013/11/28 职场文书
高中的职业生涯规划书
2013/12/28 职场文书
网络技术专业求职信
2014/02/18 职场文书
活动总结报告范文
2014/05/04 职场文书
股东授权委托书范文
2014/09/13 职场文书
干部培训工作总结2015
2015/05/25 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang