帖几个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截取中文字符串的问题
Jul 12 PHP
Apache2 httpd.conf 中文版
Nov 17 PHP
php自动跳转中英文页面
Jul 29 PHP
PHP中文件上传的一个问题
Sep 04 PHP
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
又十个超级有用的PHP代码片段
Sep 24 PHP
YII2框架中使用yii.js实现的post请求
Apr 09 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 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
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
Node 自动化部署的方法
2017/10/17 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
跟老齐学Python之重回函数
2014/10/10 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
Python3 操作符重载方法示例
2017/11/23 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python Selenium截图功能实现代码
2020/04/26 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
人事专员职责
2014/02/22 职场文书
旅游市场营销方案
2014/03/09 职场文书
校庆接待方案
2014/03/18 职场文书
餐饮投资计划书
2014/04/25 职场文书
品质标语大全
2014/06/21 职场文书
企业贷款委托书格式
2014/09/12 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python