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和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
Jul 03 PHP
PHP中使用数组实现堆栈数据结构的代码
Feb 05 PHP
php-perl哈希算法实现(times33哈希算法)
Dec 30 PHP
php调用google接口生成二维码示例
Apr 28 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
10个超级有用值得收藏的PHP代码片段
Jan 22 PHP
php 实现进制相互转换
Apr 07 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
php之header的不同用法总结(实例讲解)
Nov 28 PHP
php读取本地json文件的实例
Mar 07 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 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桌面中心(四) 数据显示
2007/03/11 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
Vue实现移动端页面切换效果【推荐】
2018/11/13 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
Python中使用item()方法遍历字典的例子
2014/08/26 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
python字符串与url编码的转换实例
2018/05/10 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
Python的缺点和劣势分析
2019/11/19 Python
进口业务员岗位职责
2014/04/06 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
跳槽求职信范文
2014/05/26 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
清洁工个人工作总结
2015/03/05 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android