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注释实例技巧
Oct 03 PHP
解析yii数据库的增删查改
Jun 20 PHP
php生成短域名函数
Mar 23 PHP
PHP检测链接是否存在的代码实例分享
May 06 PHP
thinkphp实现分页显示功能
Dec 03 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
PHP中常用的魔术方法
Apr 28 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
PHP抽象类与接口的区别详解
Mar 21 PHP
PHP大文件分块上传功能实例详解
Jul 22 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 PHP
laravel框架实现后台登录、退出功能示例
Oct 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 !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
2011/01/07 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
php笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
js style动态设置table高度
2014/10/21 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
英国现代绅士品牌:Hackett
2017/12/17 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
青年文明号复核材料
2014/02/11 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
合作意向协议书
2015/01/29 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL