首先我们来看数据表

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

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

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

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

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

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

好了,贴出代码:

* Created by PhpStorm.

* User: Administrator

* Date: 2017/9/24

* Time: 17:14*/namespace app\admin\model;usethink\Model;class Cate extendsModel

{public functioncateTree(){$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方法之后,声明一个静态数组,保证每次递归调用的时候数组里面的数据不会改变,然后循环从数据库里面查询的数据。

$value的值表示数据库里面的一行,是一个数组,$value[‘名字‘]表示一行里面的一个字段。

首先我们通过

$value[‘pid‘] == $pid

判断当前的pid是否为0,因为我们在sort方法一开始的时候就给了一个默认值0,此时$pid为0。

这样做的目的就是选出第一个顶级节点。

如果找到了第一个顶级节点,假如是中国,那么满足if的条件,就进入条件体,先给$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"}

{$cate.id}<?php echo str_repeat("-",$cate["level"]*8)?>{$cate.cate_name}{/volist}

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

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

<?php echo str_repeat("-",$cate["level"]*8)?>{$cate.cate_name}

得到最终的结果。

原文:http://www.cnblogs.com/hzStudy/p/7588914.html

php无线级输出数据,thinkphp5.0无限极分类及格式化输出相关推荐

  1. tp6中无限极分类里面的获取多级分类数据

    作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 文章目录 前言 一.什么是多级分类数据? 二.使用步骤 sql 代码 2.效果图 总结 前言 和大家共同完成获取多级分类数据 ...

  2. PHP无限极分类实现

    简单的无限极分类的数据结构是,至少一个id要对应一个pid,例如  INSERT INTO `district` (`id`, `pid`, `others`) VALUES 这样的数据结构便可做无限 ...

  3. php无限极分类整理

    $list = array (array ('id' => '1','menuname' => '系统设置','parentid' => '0','sort' => '0',) ...

  4. TP ------实现无限极分类读取数据

    1.数据库设计 2.在app/common/business/Category.php控制器,因为可能后面前后端需要调用公共目录所以把公共模块放在common下,代码如下 <?php /***C ...

  5. php 实现无限极分类详解

    php 实现无限极分类 原始数据复制代码 $array = array(array('id' => 1, 'pid' => 0, 'n' => '河北省'),array('id' = ...

  6. php无极分类非递归_无限极分类算法,对你一定有帮助

    无限级分类是开发中常见的情况,也经常会在面试,主考官问到,笔试中遇到,因此本文对常见的无限极分类算法进行总结归纳,其实大多数就是迭代与递归. 1.循环迭代实现 $arr = [1=>['id'= ...

  7. 无限极分类不知pid_PHP实现无限极分类

    导读:说到无限极分类,这个在程序中是常见的一个功能点了.实现的方式也有很多种,今天着重分享一下涉及到数据库的无线分类,可以使用递归处理,也可以使用循环查询数据库处理.但是我们考虑到数据库的性能问题,都 ...

  8. php 递归实现无限极分类和排序_Laravel框架实现无限极分类

    php中文网最新课程 每日17点准时技术干货分享 最近开发商品功能,在尝试递归和引用方式后,蓦然回首,突然发现laravel框架有更简单高效的实现方式,无限极分类最佳实践,open code与大家共享 ...

  9. TreeView无限极分类绑定(从数据库读取数据源)

    TreeView这个控件其实我本来不怎么会用到,今天有一个项目要用到,而且是无限极的分类数据绑定,于是就根据自己以前写过的代码别写出了这个无限极分类的例子,呵呵希望能够对大家有所帮助,本人尽量把注释写 ...

最新文章

  1. f2 自适应_典型的三行二列居中高度自适应布局
  2. 2018-12-10
  3. Django-cookie的保存以及删除操作
  4. Java8新的异步编程方式 CompletableFuture(三)
  5. 软件开发模型_QT开发(二十三)——软件开发流程
  6. libgdx for eclipse开发环境搭建
  7. CSS display 常用属性小结
  8. 机器人工程师入门知识框架(思维导图)
  9. 网络扫描实验(win10使用nmap,X-Scan工具使用)
  10. java给pdf加水印_java pdf添加水印
  11. Excel冻结窗口及设置下拉菜单
  12. 最新Gxlcms有声小说系统/小说听书系统源码
  13. 计算机的配件知识,组装一台电脑需要哪些配件 DIY装机必看的电脑硬件知识详解 (全文)...
  14. nginx配置前端网站
  15. 游戏设计分析——魔塔
  16. 【超级炫酷的旋转特效——html实现(附源代码)】
  17. js vue汉字转拼音或拼音首字母
  18. 5年专业研究,这份云原生安全指南请查收
  19. 过滤器VS拦截器的4个区别,看完豁然开朗!
  20. 视觉设计师跟平面设计_用户体验设计师应了解的6条视觉设计原则

热门文章

  1. 1000以内的回文数_杭城有学校带学生玩扑克、数糖果... “云课堂”下的数学很有趣!这些数学游戏,居家玩起来~...
  2. 如何解决git冲突,出现更新失败向下的箭头?
  3. json与字面量定义对象的区别,请不要混淆,与字符串转换
  4. c51语言的数据存储模式,第5章项目三单片机存储结构及C51语言.ppt
  5. c语言系统函数——目录操作
  6. intellij idea 在什么地方打开终端Terminal
  7. 前端开源项目周报0418
  8. Cocos2d-x 3.0修改Android平台帧率fps - 解决游戏运行手机发热发烫问题
  9. js多个物体运动问题2
  10. 基于FFmpeg接收RTSP的ts流