注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

xiaozhuge0825的博客

 
 
 

日志

 
 

关于PHP实现无限分类的方法探索  

2010-02-24 10:09:13|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

无限分类的方法很多,现在比较流行的是使用父ID来实现,而使用父ID一般是使用递归来实现,以下我用两种方法来实现。

首先我们先建立以下数据表:(sort表)

id pid name
int(主键) int varchar

先说明一下这个数据表的意义,id是唯一的,而pid就是父分类的id,name就是分类的名称。

我们首先约定一下,当pid为0的时候就是顶级分类,而不为0的时候就是子分类。

  1. 第一种实现方法:
  2. 第一种实现方法的思路是把pid为0的分类取出来,然后再以这些顶级分类的id作为父id来取得他们的子分类,然后再以他们的子分类id作为父id,如此一直循环下去,直到把所有的分类都取完。代码如下:

    代码片段

    <?php

    $conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库

    function get_sort_list($pid) {

    global $conn;

    $sql = “SELECT * FROM sort WHERE pid=‘0’”;

    $query = mysql_query($sql, $conn);

    While ($row = mysql_fetch_array($query)) {

    echo $row[‘name’];

    get_sort_list($row[‘id’]);

    }

    }

    get_sort_list(0);//以pid为0作为开始

    ?>

    上面的代码我们使用了递归的方法来实现,不过当我们运行的时候会发现分类没有分层,全部都是在一个层次,一点都不美观,所以我们可以添加一个级别给他,怎么做呢?

    代码片段

    <?php

    $conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库

    function get_sort_list($pid, $leven) {

    global $conn;

    $sql = “SELECT * FROM sort WHERE pid=‘0’”;

    $query = mysql_query($sql, $conn);

    While ($row = mysql_fetch_array($query)) {

    for ($i = 0; $i < $leven; $i++) {

    echo ‘&nbsp;&nbsp;&nbsp;’;

    }

    echo $row[‘name’];

    get_sort_list($row[‘id’], $leven + 1);

    }

    }

    get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数

    ?>

    这样修改之后我们会发现分类分层了。

  3. 第二种实现方法:
  4. 我们发现在第一种方法中,每次取得一个分类都要查询一次数据库,如果分类多的话(好似淘宝那样)速度是非常不乐观的,那我们怎么来重构他呢?

    我们可以先一次把所有的分类都取出来,然后再用PHP去处理他。而原理跟第一种方法差不多,都是根据pid去获得子分类。实现方法如下:

    代码片段

    <?php

    $conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库

    $query = mysql_query(“SELECT * FROM sort”);

    $sorts = array();

    //取出所有分类

    While($row = mysql_fetch_array($query)) {

    $sorts[] = $row;

    }

    function get_sort_list($pid, $leven) {

    global $sorts;

    foreach ($sorts as $sort) {

    if ($sort[‘pid’] == $pid) {//如果当前分类的pid等于要获取的pid

    for ($i = 0; $i < $leven; $i++) echo ‘&nbsp;&nbsp;&nbsp;’;

    echo $sort[‘name’];

    get_sort_list($sort[‘id’], $leven + 1);

    }

    }

    }

    get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数

    ?>

    好了,现在只查询一次数据库就可以实现第一种方法了。

  评论这张
 
阅读(172)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018