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 相关文章推荐
在线短消息收发的程序,不用数据库
Oct 09 PHP
怎样在PHP中通过ADO调用Asscess数据库和COM程序
Oct 09 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
PHP递归调用的小技巧讲解
Feb 19 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
PHP实现邮件群发的源码
Jun 18 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP中include和require的区别实例分析
May 07 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
Python 爬虫学习笔记之单线程爬虫
2016/09/21 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
建筑自我鉴定
2013/10/19 职场文书
食品厂厂长岗位职责
2014/01/30 职场文书
环保建议书作文
2014/03/12 职场文书
机关节能减排实施方案
2014/03/17 职场文书
幼儿教师求职信
2014/05/24 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
小学毕业感言100字
2015/07/30 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang