帖几个PHP的无限分类实现想法~


Posted in PHP onJanuary 02, 2007

1、做网站的一般都会遇到处理分类的问题, 偶来帖几个处理无限分类的例子
数据库的结构很简单:
id, fatcher_id, name, ......
这样的设计短小精悍,完全满足3NF..可以完全绝大多数要求,OK,让偶们看看这种数据库结构下的程序实现.

1.递归查询数据库
最要命的做法~也是最好实现的做法

类别1

类别1.1

类别1.1.1

类别1.2

类别2

类别2.1

类别3

类别3.1

类别3.2
......
为了生成这样的目录结构,程序递归一次就查询一次数据库,在您任何涉及分类的地方(翻页,查询....),数据库都会悲壮地操作硬盘....阿门~so~跳一下吧...
2.查询一次数据库,递归数组生成以上目录结构
帖一个大致的思路
function SelectList(&$Data, $RootID = 0')
{
     for($i = 0; $i < count($Data); $i++)
     {
           if($Data[$i]['UID'] == $RootID)
           {
                 ......//处理,直接生成HTML或者保存入数组都OK啦
                 $this->SelectRecursion($Data, $Data[$i]['ID'], $blank, $Match);
           }
     }
     return $this->Output;
}
这种强度的递归一般的网站系够用啦~不过碰到BT点的,有几K甚至上W的分类,递归一遍可能要百毫秒以上,在考虑并发的情况下....呵呵~我们再跳一下吧
3.查询一次数据库,非递归生成目录结构
这一步,程序的技巧来了~只对结果遍历一次就能生成上面那样的目录结构,想要把它格式化成网页的显示样式就很方便咯~下面的系别人写的,偶试过完全可行
function GetArray($RootID = 0)
{
     $Data      = array();

     $Data      = $tblObj->MapResult($tblObj->Select());

    $Output = Array();
    $i = 0;
    $len = Count($Data);
    if($RootID)
    {
        while($Data[$i]['UID'] != $RootID && $i < $len)      $i++;
    }
    $UpID   = $RootID;     //上个节点指向的分类父ID
    for($cnt = Count($Data); $i < $cnt;)   //历遍整个分类数组
    {
        $j = 0;     //初始化此次分类下子分类数据计数
        if ($UpID == $RootID)   //在第一次循环时将所有一级分类保存到$Output这个数组中
        {
          while($Data[$i]['UID'] == $UpID && $i < $len) //判断上一个节点是否为兄弟节点
          {
            $Output[$j] = $Data[$i];                   //保存该节点到Output这个数组中
            $tmp[$Data[$i]['ID']] = &$Output[$j]; //并且将该节点ID在Output中的位置保存起来.
            $i++;
            $j++;
          }
        }
        else
        {
          while($Data[$i]['UID'] == $UpID && $i < $len)
          {
            if($tmp[$UpID])
            {
                $tmp[$UpID]['Child'][$j] = $Data[$i];
                $tmp[$Data[$i]['ID']] = &$tmp[$UpID]['Child'][$j];   //保存该节点ID在Output中的位置
            }
            $i++;
            $j++;
          }
        }
        $UpID = $Data[$i]['UID'];
    }
    return $Output;
  }

程序看着好累人啊~这段代码的效率比上一段快了十几倍呢,强度系够大了...
不过....90%的网站用这样的代码都浪费啦~偶遇到过的网站分类一般都在四级以下,那么,还能再优化一下么?........再....再跳一下吧..
4.从数据库入手~
稍微改动一下数据库的结构,加一个layer的冗余字段,这个是db desing高手想出来的,偶把他帖出来而已
id         name       father_id       layer
1         总类别       0           000000
2         类别1           1           010000
3         类别1.1         2           010100
4         类别1.2         2           010200
5         类别2           1           020000
6         类别2.1         5           020100
7         类别3           1           030000
8         类别3.1         7           030100
9         类别3.2         7           030200
10         类别1.1.1         3           010101

现在按layer的大小来检索一下:SELECT * FROM Type_table_2 ORDER BY type_layer

列出记录集如下:

id         name       father_id       layer
1         总类别       0           000000
2         类别1           1           010000
3         类别1.1         2           010100
10         类别1.1.1         3           010101
4         类别1.2         2           010200
5         类别2           1           020000
6         类别2.1         5           020100
7         类别3           1           030000
8         类别3.1         7           030100
9         类别3.2         7           030200

看见了么~一次查询连目录结构都生成好咯~,这样程序就轻松很多了,只是多了维护layer字段的工作,这个例程中layer字段每一级能处理99个分类,如果有BT的应用,改大些就行了,呵呵,先分析你的需求吧

OK~OVER~闪人~

PHP 相关文章推荐
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
解析PHP计算页面执行时间的实现代码
Jun 18 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
PHP下载文件的函数实例代码
May 18 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
php封装的mysqli类完整实例
Oct 18 PHP
php的4种常用运行方式详解
Dec 22 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
PHP实现用户登录的案例代码
May 10 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 PHP
PHP+MYSQL开发工具及资源收藏
Jan 02 #PHP
分享PHP入门的学习方法
Jan 02 #PHP
php中常用编辑器推荐
Jan 02 #PHP
PHP中的日期处理方法集锦
Jan 02 #PHP
PHP语法速查表
Jan 02 #PHP
require(),include(),require_once()和include_once()的异同
Jan 02 #PHP
开发大型 PHP 项目的方法
Jan 02 #PHP
You might like
一个MYSQL操作类
2006/11/16 PHP
mysql limit查询优化分析
2008/11/12 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
PHP单态模式简单用法示例
2016/11/16 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
学习Vue组件实例
2018/04/28 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python中常用信号signal类型实例
2018/01/25 Python
python PyTorch预训练示例
2018/02/11 Python
python机器人运动范围问题的解答
2019/04/29 Python
我就是这样学习Python中的列表
2019/06/02 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
运动会跳远广播稿5篇
2014/09/17 职场文书
个人职业及收入证明
2014/10/13 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
大学生自我评价范文
2015/03/03 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python