无限极分类信息

1.数据库设计:

CREATE TABLE `smar_category` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘栏目ID‘,
  `pid` smallint(5) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘父ID‘,
  `catname` varchar(30) NOT NULL COMMENT ‘栏目名称‘,
  `sort` smallint(5) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘排序‘,
  PRIMARY KEY (`id`),
  INDEX pid (pid)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

2.思路:

    ①设置pid 保存父级栏目

    ②取出所有数据

    ③调用递归函数进行排序

3.源码

 1     /**
 2      * 将数据按照级别排序
 3      * @return array 返回排序好的
 4      */
 5     public function reSort(){
 6         //1.先取出所有的数据
 7         $allCategory = $this->order(‘sort desc‘)->select();
 8         //2.调用递归函数进行排序
 9         return $this->_reSort($allCategory);
10     }
11     /**
12      * 递归排序
13      * @param array $data 数组
14      * @param int $parend_id 父级
15      * @param int $level 标识当前记录是第几层的
16      * @return array 返回排序好的
17      */
18     public function _reSort($data,$parend_id = 0,$level=0){
19         static $_ret = array();
20         foreach($data as $k=>$v){
21             if($v[‘pid‘] == $parend_id){
22                 //标识当前记录是第几层的
23                 $v[‘level‘] =$level;
24                 $_ret[] =$v;
25                 //把这条记录从数组中删除,再找子类不用循环这条记录了
26                 unset($data[$k]);
27                 //再找当前这条记录的所有的子类
28                 $this->_reSort($data, $v[‘id‘],$level+1);
29             }
30         }
31         return $_ret;
32     }

4.删除栏目

 1     /**
 2      * 递归找出一个栏目的所有子栏目并且进行删除
 3      * @param  int $parend_id 父级
 4      * @return array 返回排序好的
 5      */
 6     public function getChildId($parent_id){
 7         //1.取出所有的栏目
 8         $allCat = $this->order(‘sort desc‘)->select();
 9         //2.调用递归函数在所有的栏目中找子栏目
10         return $this->_findChildId($allCat, $parent_id);
11     }
12     /**
13      * 递归排序
14      * @param array $data 数组
15      * @param int $parend_id 父级
16      * @return array 返回排序好的
17      */
18     public function _findChildId($data,$parent_id){
19         static $ret = array();
20         foreach($data as $k=>$v){
21             if($v[‘pid‘] == $parent_id){
22                 $ret[] = $v[‘id‘];
23                 //把记录从元数字中删除掉,再循环记录不用在判断这条记录
24                 unset($data[$k]);
25                 //再找这个条记录的子栏目
26                 $this->_findChildId($data,$v[‘id‘]);
27             }
28         }
29         return $ret;
30     }
31
32     
时间: 2024-10-19 01:41:50

无限极分类信息的相关文章

夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)

我们刚才只是完成了添加的一部分,但是我们的上级分类也不能永远都是只有一个死的嘛,所以我们需要对她进行修改: 我们先将add方法里面的数据查出来再说: 然后在模板页进行遍历: 展示效果如下所示: 虽然是出现了,但是没有向我们平常时候见到的无限极分类一样噢,一般比如分类 多多,分类下面的 好多美女啊 是多多的下级分类,那么好多美女啊他前面是有几个空格之类的隔开, 那么我们就需要在model层里面对她进行排序的设置了: <?php namespace Admin\Model; use Think\Mo

C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Caching 我理解是在内容中实现,这种方法适用于单服务器的生产环境. 2.a Distributed Cache 分部式缓存实现. 3.Response Cache 这种方式我理解为客户端缓存. 今天我只用了第一种实现方法,内存中缓存,之所以用这种方法我是觉得我这里用缓存的初衷是为了减少访问数据库的次数,

C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现

今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): 1 /// <summary> 2 /// 无限极节点类 3 /// </summary> 4 public class AdminUserTree 5 { 6 /// <summary> 7 /// 节点信息 8 /// </summary> 9 public int

创建无限极分类树型结构

先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) 1 public function cate_display() 2 { 3 $cate = D('Cate'); 4 $field = array('id','cate_

js实现无限极分类

转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来做了. 不能说效率多高,只是说能实现了. 其实ACMer或者学过点算法和数据结构的应该知道这其实就是一个树,用数组存罢了,用数组存树的方法相信各位ACMer已经用的不要不要的了,所有并没有什么难度,知道思路就很好写了. 思路:获取到后台传来的数组dep,然后新建一个数组list,将dep遍历一遍,获

thinkphp5.0无限极分类及格式化输出

首先我们来看数据表 从上图中可以发现,中国下有贵州,北京两个子节点,而北京有天安门一个子节点,纽约的子节点是"纽约的子类". 从pid为0看出,中国和纽约是顶级节点. 因为贵州的pid是1,而中国的id为1,所以贵州的父节点是中国,至于type字段,可以不用管,只是我自己的项目需要. 可以发现,着写数据在数据表中是无序的,并没有我们想象中的层次结构分明并且可读性很好. 那么,当使用无限极分类之后数据的输出是怎样的呢?如下: 这样就能够很清晰的看出他们的层次结构了,那么这样的效果在thi

PHP无限极分类

概述 ??在实际工作中,经常要用到无限极分类.如导航表等等.到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了.下面介绍两种无限极分类:递归,使用引用 数据准备 //初始化原始数据(id=>编号,name=>显示名称,pid=>父级目录id,sort=>排序顺序) $data[1] = array('id'=>'1','name'=>'一级目录A','pid'=>'0','sort'=>'1

php递归无限极分类

递归无限级分类有几种形式,我这里只举例比较常用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'pid' => 0, 'user_name' => 'one', ), 2 => array( 'id' => 2, 'pid' => 1, 'user_name' => 'two', ), 3 => array( 'id' => 3, 'pid' => 1, '

递归与无限极分类

在函数内部调用本身,且在调用时要做判断. 例:输出1~9 function deeploop(&$i=1){   //引用传值,防止递归时从1开始 echo  $i; $i++; if($i < 10){             //条件判断,防止无限递归 deeploop($i); } } 2.无限极分类原理:每次分类都需要记录它的父级id,如果是顶级,则父级id为0,通过父级id,一层一层往下查. 首先从数据库中取出结果集,把结果集中的pid与顶级的pid开始,然后确定顶级父级.依次往下