帖几个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 和 MySQL 基础教程(四)
Oct 09 PHP
什么是MVC,好东西啊
May 03 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
PHP中使用file_get_contents post数据代码例子
Feb 13 PHP
ThinkPHP的SAE开发相关注意事项详解
Oct 09 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
php生成与读取excel文件
Oct 14 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
TP5框架页面跳转样式操作示例
Apr 05 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
Protoss建筑一览
2020/03/14 星际争霸
DOMXML函数笔记
2006/10/09 PHP
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
理解javascript异步编程
2016/01/27 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
anaconda如何查看并管理python环境
2019/07/05 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
python实现实时视频流播放代码实例
2020/01/11 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
金融专业个人求职信
2013/09/22 职场文书
大学在校生求职信范文
2013/11/21 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
档案管理员岗位职责
2015/02/12 职场文书
童年读书笔记
2015/06/26 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书