PHP利用递归函数实现无限级分类的方法


Posted in PHP onMarch 22, 2019

相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径。各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了。

什么是无限级分类?

无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了。其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类。分类无处不在,分类显得“无限”。我这里就不说无限分类的必要性了。

无限级分类原理简介

无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

php无限级分类是经常要用到的,本人以前一直用的是已经写好的,所以没仔细去研究过,下面是一个使用递归实现的简单的php无限级分类的函数;也许这不是最优的方法,但对于一般的应用也足够了。

数据表结构

CREATE TABLE IF NOT EXISTS `category` (
 `id` int(5) NOT NULL AUTO_INCREMENT COMMENT '唯一自增id',
 `pid` int(5) NOT NULL DEFAULT '0' COMMENT '父id',
 `sort` int(2) NOT NULL DEFAULT '0' COMMENT '排序数字',
 `name` varchar(30) DEFAULT NULL COMMENT '名称',
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='无限极分类表' AUTO_INCREMENT=1 ;

数据

INSERT INTO `category` (`id`, `pid`, `sort`, `name`) VALUES
(1, 0, 1, 'php'),
(2, 0, 2, '数据库'),
(3, 0, 3, 'javascript'),
(4, 1, 1, '框架模板'),
(5, 1, 2, '函数总结'),
(6, 2, 1, 'mysql'),
(7, 4, 1, '框架'),
(8, 4, 2, '模板'),
(9, 8, 1, 'smarty'),
(10, 7, 2, 'thinkphp'),
(11, 10, 1, 'thinkphp技巧'),
(12, 10, 2, 'thinkphp模板'),
(13, 12, 3, '模板知识总结'),
(14, 12, 2, '模板视频教程'),
(15, 11, 1, 'model技巧');

函数实现代码

function tree(&$list,$pid=0,$level=0,$html='--'){
  static $tree=array();
  foreach($list as $v){
    if($v['pid']==$pid){
      $v['level']=$level;
      $v['html']=str_repeat($html,$level);
      $tree[]=$v;
      tree($list,$v['id'],$level+1,$html);
    } 
  }
  return $tree;
}

以上tree函数的第一个参数$list就是获取的如上表的一个二维数组的结果集。需要注意的是从数据库获取结果集的sql语句必须加上order by sort asc,否则sort字段将不能发挥排序的作用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
BBS(php & mysql)完整版(三)
Oct 09 PHP
phpwind中的数据库操作类
Jan 02 PHP
简单采集了yahoo的一些数据
Feb 14 PHP
PHP中str_replace函数使用小结
Oct 11 PHP
一些php技巧与注意事项分析
Feb 03 PHP
php函数之子字符串替换 str_replace
Mar 23 PHP
PHP 小心urldecode引发的SQL注入漏洞
Oct 27 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
php封装的验证码类分享
Feb 26 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
PHP基于ip2long实现IP转换整形
Dec 11 PHP
用PHP的反射实现委托模式的讲解
Mar 22 #PHP
PHP读取目录树的实现方法分析
Mar 22 #PHP
针对PHP开发安全问题的相关总结
Mar 22 #PHP
浅谈PHP中的Trait使用方法
Mar 22 #PHP
PHP观察者模式定义与用法实例分析
Mar 22 #PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 #PHP
PHP中$GLOBALS与global的区别详解
Mar 21 #PHP
You might like
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
PHP 文件上传限制问题
2019/09/01 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
vue cli安装使用less的教程详解
2019/07/12 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
python使用多进程的实例详解
2018/09/19 Python
python超时重新请求解决方案
2019/10/21 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
Python类的动态绑定实现原理
2020/03/21 Python
详解Django中异步任务之django-celery
2020/11/05 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
和平主题的演讲稿
2014/01/12 职场文书
银行求职信怎么写
2014/05/26 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
罗马假日观后感
2015/06/08 职场文书
运动会开幕式致辞
2015/07/29 职场文书
外出培训学习心得体会
2016/01/18 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL