内容简介:thinkphp之超级无限分类 10行代码 (转载 已测试)
效果图
核心代码如下
static public $treeList = array(); //存放无限分类结果如果一页面有多个无限分类可以使用 Tool::$treeList = array(); 清空 /** * 无限级分类 * @access public * @param Array $data //数据库里获取的结果集 * @param Int $pid * @param Int $count //第几级分类 * @return Array $treeList */ static public function tree(&$data,$pid = 0,$count = 1) { foreach ($data as $key => $value){ if($value['Pid']==$pid){ $value['Count'] = $count; self::$treeList []=$value; unset($data[$key]); self::tree($data,$value['Id'],$count+1); } } return self::$treeList ; } }
$treeList[] 保存 排序 的结果 基本就是进行了一次排序 保存后就可以 unset($data[$key]); 掉
因为已经使用不到了&$data 使用按地址传参,结合unset($data[$key]);
不然会显示不完全
$value['Count'] = $count; 为当前的等级
在模板里会通过等级进行生成树形结构排序前后的数据结构
排序前的数据结构
id pid
1 0
2 0
3 1
4 3
排序后的数据结构
id pid count
1 0 1
3 1 2
4 3 3
2 0 1
public function index() { $menu = M('Menu'); $list = $menu->order('**Pid ASC**,Morder DESC,Id ASC')->select(); $this->assign('List',Tool::tree($list)); $this->display(); }
控制器里调用
<table class="table table-hover table-bordered table-list"> <thead> <tr> <th width="100">菜单名称</th> </tr> </thead> <foreach name="List" item="vo" key="k"> <tr> <td style="text-indent:{$vo['Count']*20}px;"> <neq name="vo.Count" value="1">| -- </neq> {$vo.we_menu_name} </td> </tr> </foreach> </table>
模板使用里<volist> 正常输出可
把需要生成树结构的字段 修改成如上测试了
如果是3000条的话 用时 0.5秒 1000个的话 0.02秒的左右
超过3000效率就会大幅度降低 2000左右的效率还是比较高的
顺便贴一下我自己整理的
控制器代码
public function index(){ $menu = M('we_menu'); $list = $menu->order('we_menu_leftid ASC,id ASC')->select(); $this->assign('List',$this->tree($list)); $this->display(); } static public $treeList = array(); //存放无限分类结果如果一页面有多个无限分类可以使用 Tool::$treeList = array(); 清空 /** * 无限级分类 * @access public * @param Array $data //数据库里获取的结果集 * @param Int $pid * @param Int $count //第几级分类 * @return Array $treeList */ static public function tree(&$data,$pid = 0,$count = 1) { foreach ($data as $key => $value){ if($value['we_menu_leftid']==$pid){ $value['Count'] = $count; self::$treeList []=$value; unset($data[$key]); self::tree($data,$value['id'],$count+1); } } return self::$treeList ; }
index.HTML
<table class="table table-hover table-bordered table-list"> <thead> <tr> <th width="30">菜单名称</th> </tr> </thead> <foreach name="List" item="vo" key="k"> <tr> <td style="text-indent:{$vo['Count']*20}px;"> <neq name="vo.Count" value="1">| -- </neq> {$vo.we_menu_name} </td> </tr> </foreach> </table>
数据库截图:
数据表生成sql:
/* Navicat MySQL Data Transfer Source Server : bendi Source Server Version : 50617 Source Host : localhost:3306 Source Database : thinkcmf Target Server Type : MYSQL Target Server Version : 50617 File Encoding : 65001 Date: 2017-10-31 11:26:14 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for cmf_we_menu -- ---------------------------- DROP TABLE IF EXISTS `cmf_we_menu`; CREATE TABLE `cmf_we_menu` ( `id` tinyint(11) NOT NULL AUTO_INCREMENT, `we_menu_name` varchar(20) NOT NULL COMMENT '菜单名称', `we_menu_leftid` int(11) NOT NULL COMMENT '菜单上级ID', `we_menu_type` tinyint(2) NOT NULL COMMENT '菜单类型 1为弹出 2为链接', `we_menu_typeval` varchar(200) NOT NULL COMMENT '菜单类型值', `is_del` tinyint(2) NOT NULL DEFAULT '0' COMMENT '假删', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of cmf_we_menu -- ---------------------------- INSERT INTO `cmf_we_menu` VALUES ('10', '菜单一', '0', '2', 'http://www.jianshu.com/u/7a66106d8bce', '0'); INSERT INTO `cmf_we_menu` VALUES ('11', '菜单二', '0', '1', '', '0'); INSERT INTO `cmf_we_menu` VALUES ('12', '菜单三', '0', '1', '', '0'); INSERT INTO `cmf_we_menu` VALUES ('13', '二级菜单', '11', '2', 'http://www.jianshu.com/u/7a66106d8bce', '0'); INSERT INTO `cmf_we_menu` VALUES ('14', '三级菜单', '12', '2', 'http://www.jianshu.com/u/7a66106d8bce', '0');
最后效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- (授权转载)10段奇葩的代码注释
- 创建自己的 CSS 网格系统【转载 | 译】
- [MySQL]长连接和短链接(转载)
- Windows Phone开发(一)-- 开发环境和结构【转载】 - dekevin
- Windows Phone开发(一)-- 开发环境和结构【转载】 - dekevin
- 使用Travis CI自动部署Hexo【转载修订版】
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux C编程一站式学习
宋劲杉 / 电子工业出版社 / 2009-12 / 60.00元
本书有两条线索,一条线索是以Linux平台为载体全面深入地介绍C语言的语法和程序的工作原理,另一条线索是介绍程序设计的基本思想和开发调试方法。本书分为两部分:第一部分讲解编程语言和程序设计的基本思想方法,让读者从概念上认识C语言;第二部分结合操作系统和体系结构的知识讲解程序的工作原理,让读者从本质上认识C语言。. 本书适合做零基础的初学者学习C语言的第一本教材,帮助读者打下牢固的基础。有一定......一起来看看 《Linux C编程一站式学习》 这本书的介绍吧!