php数组无限文类,帖几个PHP的无限分类实现想法~

帖几个PHP的无限分类实现想法~

更新时间:2007年01月02日 00:00:00   作者:

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 

{

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 

}

$UpID   = $RootID;     //上个节点指向的分类父ID

for($cnt = Count($Data); $i 

{

$j = 0;     //初始化此次分类下子分类数据计数

if ($UpID == $RootID)   //在第一次循环时将所有一级分类保存到$Output这个数组中

{

while($Data[$i]['UID'] == $UpID && $i 

{

$Output[$j] = $Data[$i];                   //保存该节点到Output这个数组中

$tmp[$Data[$i]['ID']] = &$Output[$j]; //并且将该节点ID在Output中的位置保存起来.

$i++;

$j++;

}

}

else

{

while($Data[$i]['UID'] == $UpID && $i 

{

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~闪人~

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要介绍了PHP实现将多个文件中的内容合并为新文件的方法,涉及php编码转换、文件与目录的遍历以及文件读写相关操作技巧,需要的朋友可以参考下2017-06-06

4f55910a645b073bc4fc65dc10dc14bd.png

discuz的ajaxpost功能有点强大,但缺点也很明显,如果ajaxpost提交一个FORM,那么返回的时候只能显示showmessage的内容,而不会主动跳转,因此这里就有一个小技巧 了。2011-01-01

0ea3c7666119d5615e582f823fb3fad6.png

这篇文章主要介绍了PHP基于新浪IP库获取IP详细地址的方法,涉及php正则、curl及编码转换相关操作技巧,需要的朋友可以参考下2017-05-05

4f96a78db829b1556ff16de21e013c7a.png

这篇文章主要介绍了Drupal7 form表单二次开发要点与实例,解决了经常使用的Form表单提交后跳转问题,需要的朋友可以参考下2014-03-03

8cc1031babc6aff2319f1c6af8544aa0.png

这篇文章主要介绍了Laravel实现批量更新多条数据,需要的朋友可以参考下2020-04-04

0c932a99bb7b6f23c937db507070cc7b.png

垃圾回收机制是一种动态存储分配方案,它会自动释放程序不再需要的已分配的内存块,PHP也在语言层实现了内存的动态管理.内存的动态管理将开发人员从繁琐的内存管理中解救出来2012-12-12

cca732bf65a93ed2ec0ac80c638460fe.png

Xdebug提供了丰富的调试函数,也可将Xdebug安装配置为zend studio、editplus调试PHP的第三方插件,通过开启自动跟踪(auto_trace)和分析器功能,可以直观的看到PHP源代码的性能数据,以便优化PHP代码,本文介绍了PHP 7安装调试工具Xdebug扩展的方法,需要的朋友可以参考。2017-06-06

2d9f31f2af7b675a3d153d2b7f1035a7.png

这篇文章主要介绍了PHP实现基本留言板功能,结合实例形式分析了PHP实现基本留言板功能的相关原理、数据库构建、功能实现等步骤与相关操作技巧,需要的朋友可以参考下2020-03-03

b452cee8ec5cd9e58ab98eba17281e59.png

通过判断字符串和截取字符串再拼接起来实现文本图片自动换行,以下贴出此代码2013-03-03

f4838ec7e2d4da28e0b57d4e852dadd4.png

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。下面来看php中多种序列化的对比。2016-08-08

最新评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值