Loading...

多级目录的处理思路

2012-09-04 11:50:17 发表于PHP, 网站技术 本文链接: 多级目录的处理思路

现在很多系统,如文件管理,内容管理都存在多级目录的问题,而多数主流的程序(甚至包括知名的网店程序)居然都是采用数据库逐级查询来将目录按照分级形式显示出来,这种思路非常不科学,而且还消耗资源。

当然,本人以前也是这么做的,为了减少资源的开销,我一般都是添加了文件缓存。除非目录有变动,缓存不会做更改,这种方法大大降低了每次载入目录的资源占用,当然,也会很明显的减少网页的载入时间。

不过,我这里要介绍一个新的思路,对我自己来说,是原创,不过肯定有人已经用了这种方法。

一般来说,多级目录在数据库中多半有这样几个字段 ID name parent_ID,传统的方式是首先列取parent_ID=0的目录,然后根据个目录的ID,逐级获取parent_ID =自己ID的目录,直到逐级获取完毕。

我自己的思路是,一次性将目录读取完毕,然后将读取的数据保存在一个多维的数组中。然后通过递归函数,对多维数组进行处理,从而实现分级的目录格式。这样,递归处理由文件处理转向的内存级别的处理,速度和效率一下上升了一个数量级。

例子

从数据库中读取cat

$sql = “SELECT * FROM “.CONTENT_CAT.” WHERE 1″;
$result = $db->query($sql);
if (MDB2::isError($result)) {
die ($result->getMessage());
}
$catinfo = $result->fetchAll(MDB2_FETCHMODE_OBJECT) ;
$db->disconnect();
foreach( $catinfo as $cat) $cats[$cat->parent_id][] = $cat;

其中 $cat[catID]

<?php
function showCat($cats,$index){
echo ‘<ul class=”dir”>’;
foreach( $cats[$index] as $subcats ){
echo “<li>”;
echo  $subcats->cat_name ;
if( count( $cats[$subcats->id]) >0 ){
showCat($cats,$subcats->id);
}
echo “\n</li>\n”;
}
echo “</ul>”;
}

标签:
发表于 2012-09-04 11:50:17 目录:PHP, 网站技术 [RSS 2.0] 你可以发表评论, 或者从您的网站 trackback
  • 相关阅读
  • homezz 美国专业主机商
    已经有9位大师动手指导 拒绝低俗
    • 1楼 寇老西儿 在2012.09.04 11:53发表评论如下: 回复

      虽然看不懂,但是果断抢沙发了

      • 2楼 小萌萌 在2012.09.04 11:56发表评论如下: 回复

        小萌萌路过此处,前排留名,专业抢沙发~舔一下东哥~~嗷嗷~

        • 3楼 mosir 在2012.09.04 12:44发表评论如下: 回复

          噢,空间换时间,楼上那此表情怎么弄出来的?

          • 3楼附属品 江东 在2012.09.04 13:16发表评论如下: 回复

            你空间换时间只是针对cache,我这文的重点ke不在cache

            • 3楼附属品 Lane East 在2012.09.04 13:52发表评论如下: 回复

              把多次对数据库的操作并为一次,放到内存中,从而将对数据的操作转换成对内存的操作,提高了速度。由于通常目录的规模不会太大,所以这个方案还是挺合适的。

          • 4楼 mosir 在2012.09.04 12:48发表评论如下: 回复

            看不懂,路过,抢沙发

            • 5楼 interjc 在2012.09.20 21:27发表评论如下: 回复

              虽不懂,觉强大。

              • 6楼 epile 在2012.09.22 23:04发表评论如下: 回复

                不知道东哥又在研发什么神器

                • 7楼 waiting 在2012.11.02 16:34发表评论如下: 回复

                  这个办法是在应用层(PHP)实现。对于遍历树状目录在数据库的一个办法是采用“先序遍历”,学过《数据结构》的知道,用左右叶节点值来实现高效的子节点查询

                  评论分页: 1
                  (Required)
                  (Required, not published)
                  如果留言未显示无需重复留言,我将为你恢复!