php之无限极分类

首先建立分类信息表:

1 CREATE TABLE IF NOT EXISTS `category` (
2   `categoryId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
3   `parentId` smallint(5) unsigned NOT NULL DEFAULT ‘0‘,
4   `categoryName` varchar(50) NOT NULL,
5   PRIMARY KEY (`categoryId`)
6 )  ;

插入若干数据:

 1 INSERT INTO `category` (`categoryId`, `parentId`, `categoryName`) VALUES
 2 (1, 0, ‘php‘),
 3 (2, 0, ‘java‘),
 4 (3, 0, ‘c/c++‘),
 5 (4, 1, ‘php基础‘),
 6 (5, 1, ‘php开源资料‘),
 7 (6, 1, ‘php框架‘),
 8 (7, 2, ‘java Se‘),
 9 (8, 2, ‘java EE‘),
10 (9, 2, ‘java Me‘),
11 (10, 3, ‘c/c++基础编程‘),
12 (11, 3, ‘c/c++系统开发‘),
13 (12, 3, ‘c嵌入式编程‘),
14 (13, 3, ‘c++应用开发‘),
15 (14, 13, ‘c++桌面应用开发‘),
16 (15, 13, ‘c++游戏开发‘);

下面是php代码:

 1 <?php
 2 //php无限级分类
 3
 4 //获取某分类的直接子分类
 5 function getSons($categorys,$catId=0){
 6     $sons=array();
 7     foreach($categorys as $item){
 8         if($item[‘parentId‘]==$catId)
 9             $sons[]=$item;
10     }
11     return $sons;
12 }
13
14 //获取某个分类的所有子分类
15 function getSubs($categorys,$catId=0,$level=1){
16     $subs=array();
17     foreach($categorys as $item){
18         if($item[‘parentId‘]==$catId){
19             $item[‘level‘]=$level;
20             $subs[]=$item;
21             $subs=array_merge($subs,getSubs($categorys,$item[‘categoryId‘],$level+1));
22
23         }
24
25     }
26     return $subs;
27 }
28
29 //获取某个分类的所有父分类
30 //方法一,递归
31 function getParents($categorys,$catId){
32     $tree=array();
33     foreach($categorys as $item){
34         if($item[‘categoryId‘]==$catId){
35             if($item[‘parentId‘]>0)
36                 $tree=array_merge($tree,getParents($categorys,$item[‘parentId‘]));
37             $tree[]=$item;
38             break;
39         }
40     }
41     return $tree;
42 }
43
44 //方法二,迭代
45 function getParents2($categorys,$catId){
46     $tree=array();
47     while($catId != 0){
48         foreach($categorys as $item){
49             if($item[‘categoryId‘]==$catId){
50                 $tree[]=$item;
51                 $catId=$item[‘parentId‘];
52                 break;
53             }
54         }
55     }
56     return $tree;
57 }
58
59
60 //测试 部分
61 $pdo=new PDO(‘mysql:host=localhost;dbname=test‘,‘root‘,‘8888‘);
62 $stmt=$pdo->query("select * from category order by categoryId");
63 $categorys=$stmt->fetchAll(PDO::FETCH_ASSOC);
64
65 $result=getSons($categorys,1);
66 foreach($result as $item)
67     echo $item[‘categoryName‘].‘<br>‘;
68 echo ‘<hr>‘;
69
70 $result=getSubs($categorys,0);
71 foreach($result as $item)
72     echo str_repeat(‘  ‘,$item[‘level‘]).$item[‘categoryName‘].‘<br>‘;
73 echo ‘<hr>‘;
74
75 $result=getParents($categorys,7);
76 foreach($result as $item)
77     echo $item[‘categoryName‘].‘ >> ‘;
78 echo ‘<hr>‘;
79
80 $result=getParents2($categorys,15);
81 foreach($result as $item)
82     echo $item[‘categoryName‘].‘ >> ‘;
83 ?>

下面是运行的结果:

时间: 2024-10-27 13:38:33

php之无限极分类的相关文章

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

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

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开始,然后确定顶级父级.依次往下

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

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

递归的一些应用(二)无限极分类

用递归的方法实现无限极分类 通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ----------------------------

PHP无限极分类详谈

当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,让我们怎么学习嘛,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了. 比如一个category表:有id, name, pid, sort 就这四个简单的字段,不要太复杂了. id    name          pid      sort1     PHP           0       1

php实现smarty模板无限极分类的方法

本文和大家分享的主要是php中 实现smarty 模板无限极分类相关内容,一起来看看吧,希望对大家 学习php有所帮助. <?php $conn = mysql_connect("localhost","admin","admin"); mysql_select_db("people_shop",$conn); mysql_query("SET NAMES 'UTF-8'"); $class_arr=

PHP无限极分类的实现(不使用递归)

无限极分类在开发中经常使用,例如:部门结构.文章分类.无限极分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在<无限级分类实现思路>一文中介绍了几种常见的实现方法,各有利弊.其中“改进前序遍历树”数据结构,便于输出和查询,但是在移动分类和常规理解上有些复杂. 2.数据结构 id fid title 1 0 中国 2 1 江苏 3 1 安徽 4 8 江阴 5 3 芜湖 6 3 合肥 7 3 蚌埠 8 2 无

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

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