php之无限极分类
首先建立分类信息表:
- CREATE TABLE IF NOT EXISTS `category` (
- `categoryId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
- `parentId` smallint(5) unsigned NOT NULL DEFAULT '0',
- `categoryName` varchar(50) NOT NULL,
- PRIMARY KEY (`categoryId`)
- ) ;
插入若干数据:
- INSERT INTO `category` (`categoryId`, `parentId`, `categoryName`) VALUES
- (1, 0, 'php'),
- (2, 0, 'java'),
- (3, 0, 'c/c++'),
- (4, 1, 'php基础'),
- (5, 1, 'php开源资料'),
- (6, 1, 'php框架'),
- (7, 2, 'java Se'),
- (8, 2, 'java EE'),
- (9, 2, 'java Me'),
- (10, 3, 'c/c++基础编程'),
- (11, 3, 'c/c++系统开发'),
- (12, 3, 'c嵌入式编程'),
- (13, 3, 'c++应用开发'),
- (14, 13, 'c++桌面应用开发'),
- (15, 13, 'c++游戏开发');
下面是php代码:
- <?php
- /*
- php无限极分类
- */
- //获取某分类的直接子分类
- function getSons($categorys,$catId=0){
- $sons=array();
- foreach($categorys as $item){
- if($item['parentId']==$catId)
- $sons[]=$item;
- }
- return $sons;
- }
- //获取某个分类的所有子分类
- function getSubs($categorys,$catId=0,$level=1){
- $subs=array();
- foreach($categorys as $item){
- if($item['parentId']==$catId){
- $item['level']=$level;
- $subs[]=$item;
- $subs=array_merge($subs,getSubs($categorys,$item['categoryId'],$level+1));
- }
- }
- return $subs;
- }
- //获取某个分类的所有父分类
- //方法一,递归
- function getParents($categorys,$catId){
- $tree=array();
- foreach($categorys as $item){
- if($item['categoryId']==$catId){
- if($item['parentId']>0)
- $tree=array_merge($tree,getParents($categorys,$item['parentId']));
- $tree[]=$item;
- break;
- }
- }
- return $tree;
- }
- //方法二,迭代
- function getParents2($categorys,$catId){
- $tree=array();
- while($catId != 0){
- foreach($categorys as $item){
- if($item['categoryId']==$catId){
- $tree[]=$item;
- $catId=$item['parentId'];
- break;
- }
- }
- }
- return $tree;
- }
- //测试 部分
- $pdo=new PDO('mysql:host=localhost;dbname=test','root','8888');
- $stmt=$pdo->query("select * from category order by categoryId");
- $categorys=$stmt->fetchAll(PDO::FETCH_ASSOC);
- $result=getSons($categorys,1);
- foreach($result as $item)
- echo $item['categoryName'].'<br>';
- echo '<hr>';
- $result=getSubs($categorys,0);
- foreach($result as $item)
- echo str_repeat(' ',$item['level']).$item['categoryName'].'<br>';
- echo '<hr>';
- $result=getParents($categorys,7);
- foreach($result as $item)
- echo $item['categoryName'].' >> ';
- echo '<hr>';
- $result=getParents2($categorys,15);
- foreach($result as $item)
- echo $item['categoryName'].' >> ';
- ?>
下面是运行的结果:

文章来源:http://blog.csdn.net/kankan231/article/details/8462349
php之无限极分类的更多相关文章
- php无限极分类以及递归(thinkphp)
php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public fu ...
- js实现无限极分类
转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要实现部门通讯录,后台传来的数据是直接从数据库里拿的部门表,所以没有层级分类,只有parentId表示从属关系,所以分类的事情就交给我来 ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制
在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...
- PHP无限极分类
当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱, ...
- PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂
当你学习php无限极分类的时候,大家都觉得一个字"难"我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一 ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现
今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...
- 谈一次php无限极分类的案例
作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...
- PHP无限极分类生成树方法,无限分级
你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了.这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. function g ...
- PHP无限极分类实现
简单版的PHP生成无限极分类代码.其中包括了数据库设计.以及输出分类HTML代码. SQL代码 CREATE TABLE `district` ( `id` int(10) unsigned NOT ...
随机推荐
- PHP-----函数和二进制
递归-----函数本身调用本身.每一个栈中的变量都是独立的,不受外部变量的影响,除非传参.这一点和Js不一样. 在一个php页面中要引用其他的php文件可以使用require,require_once ...
- jquery总结05-常用事件03-键盘事件
键盘事件 .keydown() 键盘按下触发,返回的的是键盘按键代码 .keyup() 键盘松手触发,返回的是键盘按键代码 .keypress() 键盘按下触发,返回的是敲击的字符的ASCII码
- 深入浅出设计模式——备忘录模式(Memento Pattern)
模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...
- iOS - C 应用
前言 1)操作符两端必须加空格,(每行第一个赋值语句对齐). 2)变量名必须是英文(不能是拼音):英文.数字.下划线和美元符号. 3)等于号 == 反过来写(0 == i%4)防止少些赋值号的错误. ...
- M1卡介绍
本文整理自网络. M1卡是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,目前都有国产芯片与其兼容,属于非接触式IC卡.最为重要的优点是可读可 ...
- C#连接数据库的新方法(通过web.config配置文件)
分类: asp.net技术 2009-07-08 19:40 183人阅读 评论(0) 收藏 举报 方法一. 1.web.config中<configuration>下加入以下连接代码 ...
- 【bzoj1098】办公楼
[bzoj1098]办公楼 题意 FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄 ...
- vue学习笔记之v-for与-repeat
今天看到一个v-repeat的例子 <body> <ul id="tags"> <li v-repeat="tags"> { ...
- /etc/rc.d/与/etc/rc.d/init.d的关系
/etc/init.d指向/etc/rc.d/init.d目录 . 除了直接调用脚本外(如/etc/rc.d/init.d/xinetd),还可以用service命令来控制init.d目录下的服务如 ...
- Java过滤器,SpringMVC拦截器之间的一顺序点关系
由于最近做的项目中有一部分是接口远程调用,用到了接入权限和业务权限的鉴定,需要采用SpringMVC的拦截器,以前用Struts2的时候用过拦截器,而SpringMVC的拦截器功能之前没研究过,所以这 ...