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 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
Jun 23 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
php实现将数据做成json的格式给前端使用
Aug 21 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 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 mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
js同时按下两个方向键
2007/12/01 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python实现扫雷游戏
2020/03/03 Python
python的Jenkins接口调用方式
2020/05/12 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
error和exception有什么区别
2012/10/02 面试题
思想汇报范文
2013/11/04 职场文书
消防隐患整改通知书
2015/04/22 职场文书
开场白怎么写
2015/06/01 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL