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 相关文章推荐
截获网站title标签之家内容的例子
Oct 09 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
php实现SAE上使用storage上传与下载文件的方法
Jun 29 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
深入理解PHP类的自动载入机制
Sep 16 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
Oct 11 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 PHP
Memcached介绍及php-memcache扩展安装
Apr 01 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加密解密函数代码
2013/06/19 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
javascript 节点排序 2
2011/01/31 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
jquery实现点击弹出对话框
2020/02/08 jQuery
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
Python猴子补丁知识点总结
2020/01/05 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
一套.net面试题及答案
2016/11/02 面试题
医学类个人求职信范文
2014/02/05 职场文书
环保倡议书400字
2014/05/15 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
整改通知书格式
2015/04/22 职场文书
2016年公司新年寄语
2015/08/17 职场文书