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 socket方式提交的post详解
Jul 19 PHP
删除数组元素实用的PHP数组函数
Aug 18 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
浅析关于PHP位运算的简单权限设计
Jun 30 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
php获取微信openid方法总结
Oct 10 PHP
Laravel手动返回错误码示例
Oct 22 PHP
laravel入门知识点整理
Sep 15 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
解析MySql与Java的时间类型
2013/06/22 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python脚本处理空格的方法
2016/08/08 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
车辆维修工自我评价怎么写
2013/09/20 职场文书
大学生个人简历中的自我评价
2013/12/27 职场文书
单位刻章介绍信范文
2014/01/11 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
学习方法演讲稿
2014/05/10 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL