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 09 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
PHP进程同步代码实例
Feb 12 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
yii实现使用CUploadedFile上传文件的方法
Dec 28 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
Jan 07 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
php实现的表单验证类完整示例
Aug 13 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 PHP
Laravel 连接(Join)示例
Oct 16 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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
SONY ICF-F10中波修复记
2021/03/02 无线电
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
python实现的阳历转阴历(农历)算法
2014/04/25 Python
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
Django 请求Request的具体使用方法
2019/11/11 Python
浅谈Python type的使用
2019/11/19 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
幼儿园义卖活动方案
2014/01/17 职场文书
小学教师听课制度
2014/02/01 职场文书
2014年科协工作总结
2014/12/09 职场文书
教师岗位职责范本
2015/04/02 职场文书
离婚答辩状范文
2015/05/22 职场文书
八月一日观后感
2015/06/10 职场文书
Golang jwt身份认证
2022/04/20 Golang