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 相关文章推荐
用Zend Encode编写开发PHP程序
Feb 21 PHP
php 上传功能实例代码
Apr 13 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
Views rows style模板重写代码
May 16 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
PHP的APC模块实现上传进度条
Oct 27 PHP
PHP类的特性实例分析
Sep 28 PHP
php操作access数据库的方法详解
Feb 22 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
浅谈PHP无限极分类原理
Mar 14 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
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
Python调用C++程序的方法详解
2017/01/24 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python无损压缩图片的示例代码
2020/08/06 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
记帐员岗位责任制
2014/02/08 职场文书
规划编制实施方案
2014/03/15 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
中秋节主题班会
2015/08/14 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
CSS极坐标的实例代码
2021/06/03 HTML / CSS