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 相关文章推荐
Smarty安装配置方法
Apr 10 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
PHP遍历数组的几种方法
Mar 22 PHP
PHP设置一边执行一边输出结果的代码
Sep 30 PHP
PHP开发微信支付的代码分享
May 25 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
php用户名的密码加密更安全的方法
Jun 21 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 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
基于mysql的论坛(6)
2006/10/09 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
php use和include区别总结
2019/10/13 PHP
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
详解VUE 数组更新
2017/12/16 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
编程语言Python的发展史
2014/09/26 Python
python实现简单ftp客户端的方法
2015/06/28 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
django-csrf使用和禁用方式
2020/03/13 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
商务日语毕业生自荐信范文
2013/11/14 职场文书
高中生毕业自我鉴定范文
2013/12/22 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
简历自我评价模板
2015/03/11 职场文书
资料员岗位职责范本
2015/04/13 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python