thinkphp5.0无限极分类及格式化输出详解案例一则

首先我们来看数据表
在这里插入图片描述

从上图中可以发现,中国下有贵州,北京两个子节点,而北京有天安门一个子节点,纽约的子节点是“纽约的子类”。

从pid为0看出,中国和纽约是顶级节点。

因为贵州的pid是1,而中国的id为1,所以贵州的父节点是中国,至于type字段,可以不用管,只是我自己的项目需要。

可以发现,着写数据在数据表中是无序的,并没有我们想象中的层次结构分明并且可读性很好。

那么,当使用无限极分类之后数据的输出是怎样的呢?如下:

在这里插入图片描述

这样就能够很清晰的看出他们的层次结构了,那么这样的效果在thinkphp5.0是怎么实现的呢?

好了,贴出代码:

<?php
/**
 * Created by  codeit.org.cn 
 * Time: 15:23
 */
 
namespace app\admin\model;
use think\Model;
class Cate extends Model
{
    public function cateTree(){
        $res=$this->select();
        if($res){
            $result=$this->sort($res);
            return $result;
        }
    }
    public function sort($data,$pid=0,$level=0){
    //此处数据必须是静态数组,不然递归的时候每次都会声明一个新的数组
       static $arr=array();
        foreach ($data as $key=>$value){
            if($value['pid'] == $pid){
                $value["level"]=$level;
                $arr[]=$value;
                $this->sort($data,$value['id'],$level+1);
            }
        }
        return $arr;
    }
}

首先我们可以看到,在cateTree方法中我们通过select()方法获取到了数据库里面的所有数据,然后将数据传入到sort里面,此刻我们注意到sort有三个参数,pid表示当前节点的父节点的id,level表示当前节点

为几级。(顶级节点是0级,顶级节点的子节点是1级),那么level的用处到时候输出的时候会用到,此处不用纠结。当数据传入sort方法之后,声明一个静态数组,保证每次递归调用的时候数组里面的数据不会改变,然后循环从数据库里面查询的数据。

v a l u e 的值表示数据库里面的一行,是一个数组, value的值表示数据库里面的一行,是一个数组, value的值表示数据库里面的一行,是一个数组,value[‘名字’]表示一行里面的一个字段。

首先我们通过$value[‘pid’] == p i d 判断当前的 p i d 是否为 0 ,因为我们在 s o r t 方法一开始的时候就给了一个默认值 0 ,此时 pid判断当前的pid是否为0,因为我们在sort方法一开始的时候就给了一个默认值0,此时 pid判断当前的pid是否为0,因为我们在sort方法一开始的时候就给了一个默认值0,此时pid为0。这样做的目的就是选出第一个顶级节点。
如果找到了第一个顶级节点,假如是中国,那么满足if的条件,就进入条件体,先给 v a l u e 数组加一个 l e v e l 值,然后再把 value数组加一个level值,然后再把 value数组加一个level值,然后再把value整个假如到静态数组当中去。
然后开始递归,注意,此刻sort方法的pid参数接受的是当前节点的id。为什么要这样传呢?

举个例子:如果我们循环到了中国,如下图
在这里插入图片描述
第一次递归的时候,会将static 数组入栈,以及将变量入栈,并保存程序的断点,以便递归完成之后能够顺利的找到进入递归出并继续执行程序。

如上图,找到中国后,递归,入栈,此刻静态数组里面只有“中国”一个数据。(注意:数组是一个二维数组,我只是为了简便才画了一维数组,数组里面还包含了level的信息)。通过pid判断中国下方是否有子节点,然后匹配到贵州之后,进入递归,数据入栈。此时静态数组里面又增加了贵州这个数据。

到了贵州之后,发现在我们的数据表里面并没有贵州的子节点,此时递归结束,程序返回递归入口处,继续执行循环体,栈空间如下:在这里插入图片描述
当递归回来时,贵州出栈,此时栈空间里面保存的是中国的数据,包括pid为0这个变量,level为0这个变量,以及静态数组。当执行下一个循环时,$value[‘pid’] == $pid

因为栈空间里面保存的pid是0,所以会找到北京这个数据。在这里插入图片描述
接下来的步骤就差不多了,首先foreach循环天安门的子节点,发现没有子节点,递归结束,同时将sort($data,7,3)出栈,回到递归进入出,以上为例,则回到天安门那段代码的sort处,同时执行foreach循环,查找是否有其他的节点的pid为6,即查看北京下是否还有其他子节点。如果有,则将该节点的数据入栈,如果没有则出栈,回到北京那块代码的sort处,匹配pid为1的是否还有其他节点。如果没有则回到最开始的sort处,此时递归完全结束。

此刻我们来观察数组,可以看出,通过递归,数组里的数据开始变得有序起来,如贵州是中国的一级子节点,所以紧跟在中国之后,当第一轮递归结束,到了第二轮递归时,第一个找到的是北京,所以数组里面第三个元素是北京。

那怎么得到如下的格式化数据呢?
在这里插入图片描述

我们可以发现,北京和贵州的level是相同的,注意:我们的数组还保存得有level信息(图中的level有些错误,不建议大家参考)。

level数值大的前面的短线就越多,表示级数就越大。

那么这是怎么输出的呢?

{volist name="cateList" id="cate"}
 <!--设置URL值,方便JS删除的时候获取路径-->
  <tr id="{:url('delete',array('id'=>$cate.id))}" class="url">
  <td align="center">{$cate.id}</td>
<td><?php echo str_repeat("-",$cate["level"]*8)?>{$cate.cate_name}</td>
{/volist}

以上是thinkphp的模板标签,volist和foreach是一样的道理

通过后台分配而来的cateList数据(也就是上面的静态数组),通过

<?php echo str_repeat("-",$cate["level"]*8)?>{$cate.cate_name} 得到最终的结果。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值