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 相关文章推荐
php图片加中文水印实现代码分享
Oct 31 PHP
深入for,while,foreach遍历时间比较的详解
Jun 08 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
PHP中的traits实现代码复用使用实例
May 13 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
php实现的表单验证类完整示例
Aug 13 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 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调用Oracle存储过程的方法
2008/09/12 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
nodejs教程之入门
2014/11/21 NodeJs
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
Javascript函数的参数
2015/07/16 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
vue+iview写个弹框的示例代码
2017/12/05 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python查找目录下指定扩展名的文件实例
2015/04/01 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
pycharm的python_stubs问题
2020/04/08 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
美德少年事迹材料
2014/01/23 职场文书
法人委托书
2014/07/31 职场文书
2015年人事专员工作总结
2015/04/29 职场文书