PHP递归目录菜单(不同方法)

时间:2013-11-09 02:11:28

标签: php recursion menu directory

我正在尝试创建一个PHP菜单,它显示列表中每个目录中的目录和文件,并指向这些目录中的每个文件的链接(但不是指向目录本身的链接)。目录的数量为“2013”​​,“2014”等年份,这些目录中的文件为PDF。

本质上:

  

--- 2013(未链接)

     

--------------- 01.pdf(已链接)

     

--------------- 02.pdf(链接)

     

--------------- 03.pdf(链接)

     

--- 2014(未链接)

     

--------------- 04.pdf(已链接)

     

--------------- 05.pdf(链接)

     

--------------- 06.pdf(链接)

目前,我的代码如下所示:

<?php
function read_dir_content($parent_dir, $depth = 0){
    if ($handle = opendir($parent_dir)) 
    {
        while (false !== ($file = readdir($handle)))
        {
            if(in_array($file, array('.', '..'))) continue;
            if( is_dir($parent_dir . "/" . $file) ){
                $str_result .= "<li>" . read_dir_content($parent_dir . "/" . $file, $depth++) . "</li>";
            }
            $str_result .= "<li><a href='prs/{$file}'>{$file}</a></li>";
        }
        closedir($handle);
    }
    $str_result .= "</ul>";
    return $str_result;
}
echo "<ul>".read_dir_content("prs/")."</ul>";
?>

然而,这会在处理时造成完全混乱。 (不幸的是我无法发布图像,因为我是新用户,但如果它不是太禁忌,我会提供一个偷偷摸摸的链接:http://i.stack.imgur.com/gmIFz.png

我的问题/请求帮助:

1。为什么订单以字母数字方式逆转,即为什么2013年位于列表底部且2014年位于顶部?

2. 如何在保留PDF链接的同时删除目录的链接?

3。我很困惑为什么每个目录列表的末尾都有空列表项以及为什么它们在逻辑上/一致间隔不对,即为什么是01,02,03 PDF不是从属于2013年(参见上面“基本上”的间距)?

N.B。我是编程和PHP的新手,所以请记住,我明显的错误可能非常简单。如果他们是,请提前抱歉。

编辑大量奖金也将是摆脱文件名末尾的“.pdf”,但这可能是一个完全不同的问题/问题。

2 个答案:

答案 0 :(得分:3)

PHP5有一个名为RecursiveDirectoryIterator

的类

此代码:

  1. 根据需要对列表进行排序(2013年第一次,然后是2014年)
  2. 不显示指向目录的链接
  3. 解决格式化问题
  4. BONUS:删除pdf扩展程序
  5. ...

    $myLinks = array();
    $dirIterator = new RecursiveDirectoryIterator($parent_dir);
    
    //iterates main prs directory
    foreach ($dirIterator as $file) {
    
        // If its a directory, it will iterate it's children (except if it's . or ..)
        if ($file->isDir() && $file->getFilename() != '.' && $file->getFilename() != '..') {
            $dir = new RecursiveDirectoryIterator($file->getRealPath());
            $myLinks[$file->getFilename()] = array();
            foreach ($dir as $subFile) {
                //If it finds a file whose extension is pdf
                if ($subFile->isFile() && $subFile->getExtension() == 'pdf') {
                    // Gets its filename and removes extension
                    $fname = str_replace('.pdf', '', $subFile->getFilename());
                    // adds the file information to an array
                    $myLinks[$file->getFilename()][$fname] = "prs/{$file->getFilename()}/{$subFile->getFilename()}";
                }
            }
        }
    }
    
    //Sort our array alphabetically (and numerically) and recursively
    ksort_recursive($myLinks);
    
    function ksort_recursive(&$array)
    {
        if (!is_array($array)) return;
        ksort($array);
        foreach ($array as $k=>$v) {
            ksort_recursive($array[$k]);
        }
    }
    
    
    
    // now we print our links as a unordered list
    print '<ul>';
    foreach ($myLinks as $year => $val) {
        print "<li>$year";
        foreach ($val as $name => $link) {
            print "<li><a href='$link'>$name</a></li>";
        }
        print '</li>';
    }
    print '</ul>';
    

答案 1 :(得分:1)

首先我在那里看到这一行

$str_result .= "</ul>";

但是我没有看到开放的ul标签。这可能是疯狂结果的来源。

1)我会使用scandir而不是readdir,因为它可以让你设置排序顺序。

2,3)摆脱$str_result .= "</ul>";并在你的while循环内部尝试这样的东西来删除dir链接并获得正确的顺序:(注意:我没有运行它)

if( ! in_array($file, array('.', '..')) ) { 
    if( is_dir($parent_dir . "/" . $file) ){
        $str_result .= "<li>{$file}</li>";
        $str_result .= "<ul>";
        $str_result .= "<li>" . read_dir_content($parent_dir . "/" . $file, $depth++) . "</li>";
        $str_result .= "</ul>";
    } else {
        $str_result .= "<li><a href='prs/{$file}'>{$file}</a></li>";
    }

}