帖几个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生成html分页列表的代码
Mar 18 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
三种php连接access数据库方法
Nov 11 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
php实现zip文件解压操作
Nov 03 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
Yii2超好用的日期和时间组件(值得收藏)
May 05 PHP
PHP类相关知识点实例总结
Sep 28 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
一个基于PDO的数据库操作类
2011/03/24 PHP
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
PHP对象实例化单例方法
2017/01/19 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
常用js脚本
2006/12/03 Javascript
javascript编程起步(第六课)
2007/02/27 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
学习python 之编写简单乘法运算题
2016/02/27 Python
python操作mysql数据库
2017/03/05 Python
Python 移动光标位置的方法
2019/01/20 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
英语专业应届生求职信范文
2013/11/15 职场文书
财务会计应届生求职信
2013/11/24 职场文书
学生打架检讨书大全
2014/01/23 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
党员民主生活会材料
2014/12/15 职场文书
贷款承诺书
2015/01/20 职场文书
实习生个人总结范文
2015/02/28 职场文书
技术员个人工作总结
2015/03/03 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书