手机
当前位置:查字典教程网 >编程开发 >php教程 >帖几个PHP的无限分类实现想法~
帖几个PHP的无限分类实现想法~
摘要:1、做网站的一般都会遇到处理分类的问题,偶来帖几个处理无限分类的例子数据库的结构很简单:id,fatcher_id,name,......这...

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.查询一次数据库,递归数组生成以上目录结构

帖一个大致的思路

functionSelectList(&$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.查询一次数据库,非递归生成目录结构

这一步,程序的技巧来了~只对结果遍历一次就能生成上面那样的目录结构,想要把它格式化成网页的显示样式就很方便咯~下面的系别人写的,偶试过完全可行

functionGetArray($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的冗余字段,这个是dbdesing高手想出来的,偶把他帖出来而已

idnamefather_idlayer

1总类别0000000

2类别11010000

3类别1.12010100

4类别1.22010200

5类别21020000

6类别2.15020100

7类别31030000

8类别3.17030100

9类别3.27030200

10类别1.1.13010101

现在按layer的大小来检索一下:SELECT*FROMType_table_2ORDERBYtype_layer

列出记录集如下:

idnamefather_idlayer

1总类别0000000

2类别11010000

3类别1.12010100

10类别1.1.13010101

4类别1.22010200

5类别21020000

6类别2.15020100

7类别31030000

8类别3.17030100

9类别3.27030200

看见了么~一次查询连目录结构都生成好咯~,这样程序就轻松很多了,只是多了维护layer字段的工作,这个例程中layer字段每一级能处理99个分类,如果有BT的应用,改大些就行了,呵呵,先分析你的需求吧

OK~OVER~闪人~

【帖几个PHP的无限分类实现想法~】相关文章:

无限级别菜单的实现

文件上传的实现

一个ORACLE分页程序,挺实用的.

PHP实现多线程的两个方法

PHP基于MySQL数据库实现对象持久层的方法

使用无限生命期Session的方法

编写自己的php扩展函数

PHP5的XML新特性

PHP生成指定随机字符串的简单实现方法

PHP超牛逼无限极分类生成树方法

精品推荐
分类导航