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 相关文章推荐
PHP分页显示制作详细讲解
Dec 05 PHP
用PHP 快速生成 Flash 动画的方法
Mar 06 PHP
PHP 将图片按创建时间进行分类存储的实现代码
Jan 05 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 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 验证码的实现代码
2011/07/17 PHP
php实现文件下载代码分享
2014/08/19 PHP
php字符串函数学习之substr()
2015/03/27 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
Vue实现导航栏菜单
2020/08/19 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
python基础教程之对象和类的实际运用
2014/08/29 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
python使用Tkinter显示网络图片的方法
2015/04/24 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
Python实现动态循环输出文字功能
2020/05/07 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
实习生单位鉴定意见
2013/12/04 职场文书
结对共建工作方案
2014/06/02 职场文书
医学检验专业自荐信
2014/09/18 职场文书
地雷战观后感
2015/06/09 职场文书
结婚十年感言
2015/07/31 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
golang中的空slice案例
2021/04/27 Golang
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
Python OpenCV 图像平移的实现示例
2021/06/04 Python
Go语言并发编程 sync.Once
2021/10/16 Golang
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android