帖几个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网页木马一枚 附PHP木马的防范方法
Oct 09 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
分享10段PHP常用代码
Nov 11 PHP
CodeIgniter集成smarty的方法详解
May 26 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
php中this关键字用法分析
Dec 07 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
php使用fullcalendar日历插件详解
Mar 06 PHP
apache集成php7.3.5的详细步骤
Jun 20 PHP
laravel 解决Validator使用中出现的问题
Oct 25 PHP
PHP 超级全局变量相关总结
Jun 30 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+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
PHP文件操作方法汇总
2015/07/01 PHP
php二维码生成以及下载实现
2017/09/28 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
js常见遍历操作小结
2019/06/06 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
测绘工程个人的自我评价
2013/11/10 职场文书
新护士岗前培训制度
2014/02/02 职场文书
工艺员岗位职责
2014/02/11 职场文书
党委领导班子整改方案
2014/09/30 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
python基础之爬虫入门
2021/05/10 Python
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
python 闭包函数详细介绍
2022/04/19 Python