PHP利用递归函数实现无限级分类的方法

相信很多学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字段将不能发挥排序的作用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • PHP中md5()函数的用法讲解

    PHP md5() 函数 实例 计算字符串 "Hello" 的 MD5 散列: <?php $str = "Hello"; echo md5($str); ?> 定义和用法 md5()函数计算字符串的 MD5 散列. md5()函数使用 RSA 数据安全,包括 MD5 报文摘要算法. 来自 RFC 1321 的解释 - MD5 报文摘要算法: MD5 报文摘要算法将任意长度的信息作为输入值,并将其换算成一个 128 位长度的"指纹信息"

  • PHP中quotemeta()函数的用法讲解

    PHP quotemeta() 函数 实例 在预定义的字符前添加反斜杠: <?php $str = "Hello world. (can you hear me?)"; echo quotemeta($str); ?> 定义和用法 quotemeta()函数在字符串中某些预定义的字符前添加反斜杠. 预定义的字符: 句号(.) 反斜杠(\) 加号(+) 星号(*) 问号(?) 方括号([]) 脱字号(^) 美元符号($) 圆括号(()) 提示: 该函数可用于转义拥有特殊意义的

  • PHP自动载入类文件函数__autoload的使用方法

    开发面向对象的应用程序时,往往要对每个类的定义建立一个 PHP 源文件.这样的做法产生的一个很大的烦恼就是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在PHP开发的系统中,当在一个文件中需要调用另一个PHP文件中声明的类时,就需要通过include或require把这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都包含进来,是一个让人很头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的自动加载类. 在

  • PHP join()函数用法与实例讲解

    PHP join() 函数 实例 把数组元素组合为一个字符串: <?php $arr = array('Hello','World!','Beautiful','Day!'); echo join(" ",$arr); ?> 定义和用法 join()函数返回一个由数组元素组合成的字符串. join() 函数是 implode() 函数的别名. 注释: join() 函数接受两种参数顺序.但是由于历史原因,explode() 是不行的,您必须保证 separator 参数在

  • PHP中ltrim()函数的用法与实例讲解

    PHP ltrim() 函数 实例 移除字符串左侧的字符: <?php $str = "Hello World!"; echo $str . "<br>"; echo ltrim($str,"Hello"); ?> 定义和用法 ltrim()函数移除字符串左侧的空白字符或其他预定义字符. 相关函数: rtrim() - 移除字符串右侧的空白字符或其他预定义字符. trim() - 移除字符串两侧的空白字符或其他预定义字符.

  • PHP iconv()函数字符编码转换的问题讲解

    在php中iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库:但有时候iconv对于部分数据转码会无缘无故的少一些.比如在转换字符"-"到gb2312时会出错. 下面一起慢慢看一下这个函数的用法. 最简单的应用,把gb2312置换成utf-8: $text=iconv("GB2312","UTF-8",$text); 在用$text=iconv("UTF-8","GB2312",

  • PHP析构函数destruct与垃圾回收机制的讲解

    析构函数 当某个对象成为垃圾或者当对象被显式销毁时执行. PHP5中提供的析构函数是__destruct,其与构造方法__construct相对应. 垃圾回收--GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾,PHP会将其在内存中销毁. 这是PHP的GC(Garbage Collector)垃圾处理机制,垃圾加收可以防止内存溢出. 当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中的所有对象同样被销毁. __destruc

  • PHP随机数函数rand()与mt_rand()的讲解

    PHP中rand()与mt_rand()都是用于产生一个指定范围内单独随机数的函数,如果需要产生多个不重复的随机数,请参考:PHP生成指定范围内的N个不重复的随机数. 既然他们都是用于产生一个随机数,那么他们有什么区别呢? rand() 函数默认使用 libc 随机数发生器,很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且效率很低:mt_rand() 则是用了 Mersenne Twister 中已知的特性作为随机数发生器,它产生随机数值的平均速度比 libc 提供的 rand(

  • PHP中localeconv()函数的用法

    PHP localeconv() 函数 实例 查找美国本地的数字格式化信息: <?php setlocale(LC_ALL,"US"); $locale_info = localeconv(); print_r($locale_info); ?> 定义和用法 localeconv()函数返回一个包含本地数字及货币格式信息的数组. localeconv()函数返回以下数组元素: [decimal_point] - 小数点字符 [thousands_sep] - 千位分隔符 [

  • PHP中number_format()函数的用法讲解

    PHP number_format() 函数 实例 格式化数字: <?php echo number_format("1000000")."<br>"; echo number_format("1000000",2)."<br>"; echo number_format("1000000",2,",","."); ?> 定义和用法

随机推荐