PHP实现递归无限级分类


Posted in PHP onOctober 22, 2015

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。
递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据。
Mysql
首先我们准备一张数据表class,记录商品分类信息。表中有三个字段,id:分类编号,主键自增长;title:分类名称;pid:所属上级分类id。
class表结构:

CREATE TABLE IF NOT EXISTS `class` ( 
 `id` mediumint(6) NOT NULL AUTO_INCREMENT, 
 `title` varchar(30) NOT NULL, 
 `pid` mediumint(6) NOT NULL DEFAULT '0', 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

插入数据后,如图:

PHP实现递归无限级分类

PHP
根据不同的需求,我们提供两种不同格式的自定义函数,一种是返回字符串,一种是返回数组,两种函数都使用了递归方法。先看返回字符串格式的函数:

function get_str($id = 0) { 
 global $str; 
 $sql = "select id,title from class where pid= $id"; 
 $result = mysql_query($sql);//查询pid的子类的分类 
 if($result && mysql_affected_rows()){//如果有子类 
  $str .= '<ul>'; 
  while ($row = mysql_fetch_array($result)) { //循环记录集 
   $str .= "<li>" . $row['id'] . "--" . $row['title'] . "</li>"; //构建字符串 
   get_str($row['id']); //调用get_str(),将记录集中的id参数传入函数中,继续查询下级 
  } 
  $str .= '</ul>'; 
 } 
 return $str; 
}

以上函数get_str()通过递归,不断查询下级分类,并最终返回字符串,大家可以根据项目需求修改其中的str,最终生成一个无限分级列表:

include_once('connect.php'); //连接数据库,connect.php文件自己写一个啊 
echo get_str(0); //输出无限级分类

效果如:

PHP实现递归无限级分类

接着我们来看返回数组格式的函数,一样要使用递归:

function get_array($id=0){ 
 $sql = "select id,title from class where pid= $id"; 
 $result = mysql_query($sql);//查询子类 
 $arr = array(); 
 if($result && mysql_affected_rows()){//如果有子类 
  while($rows=mysql_fetch_assoc($result)){ //循环记录集 
   $rows['list'] = get_array($rows['id']); //调用函数,传入参数,继续查询下级 
   $arr[] = $rows; //组合数组 
  } 
  return $arr; 
 } 
}

函数get_array()返回了数组,这是我们期待的,所以笔者推荐使用get_array()得到数组,这样一来,我们可以对数组进行任意操作,比如我们可以将数组转换成json格式的数据传给前端页面,前端页面可以通过解析json数据灵活展示分类信息。比如树形结构的分类列表,下拉分类列表等。

include_once('connect.php'); //连接数据库 
$list = get_array(0); //调用函数 
print_r($list); //输出数组

输出效果如:

PHP实现递归无限级分类

如果要输出json格式的数据,则可使用:

echo json_encode($list);

以上方法教会大家如何利用php实现递归无限级分类,希望这篇文章对大家的学习有所帮助。

PHP 相关文章推荐
escape unescape的php下的实现方法
Apr 27 PHP
php基础学习之变量的使用
Jun 09 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
Jun 07 PHP
php计算到指定日期还有多少天的方法
Apr 14 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
PHP如何解决微信文章图片防盗链
Dec 09 PHP
php防止网站被攻击的应急代码
Oct 21 #PHP
PHP统计当前在线用户数实例讲解
Oct 21 #PHP
php精确的统计在线人数的方法
Oct 21 #PHP
为你总结一些php信息函数
Oct 21 #PHP
深入理解PHP变量的值类型和引用类型
Oct 21 #PHP
为你总结一些php系统类函数
Oct 21 #PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 #PHP
You might like
PHP编程之高级技巧——利用Mysql函数
2006/10/09 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
PHP实现递归无限级分类
2015/10/22 PHP
PHP引用返回用法示例
2016/05/28 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
python 字符串常用方法汇总详解
2019/09/16 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
商场经理竞聘演讲稿
2014/01/01 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
暑假家长评语大全
2014/04/17 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
特种设备安全管理制度
2015/08/06 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
关于Vue中的options选项
2022/03/22 Vue.js