帖几个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开发者的10个技巧
Feb 25 PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
php文件下载处理方法分析
Apr 22 PHP
php实现paypal 授权登录
May 28 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 PHP
php 使用 __call实现重载功能示例
Nov 18 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数字运算验证码的实现代码
2015/07/30 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
Python代理抓取并验证使用多线程实现
2013/05/03 Python
python采集博客中上传的QQ截图文件
2014/07/18 Python
初步讲解Python中的元组概念
2015/05/21 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python AES加密模块用法分析
2017/05/22 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
工厂保洁员岗位职责
2013/12/04 职场文书
一夜的工作教学反思
2014/02/08 职场文书
献爱心活动总结
2014/05/07 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
机关作风建设自查报告
2014/10/22 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
网吧员工管理制度
2015/08/05 职场文书
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记