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实现选择排序的解决方法
May 04 PHP
深入php处理整数函数的详解
Jun 09 PHP
php设计模式之单例模式使用示例
Jan 20 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
php无序树实现方法
Jul 28 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
PHP日期和时间函数的使用示例详解
Aug 06 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
克隆一个新项目的快捷方式
2013/04/10 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
社区学习十八大感想
2014/01/22 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
三八节标语
2014/06/27 职场文书
司机岗位职责
2015/02/04 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
pycharm代码删除恢复的方法
2021/06/26 Python