【问题标题】:php listing directory and sub-directories as hyper-links with option for new folderphp 将目录和子目录作为超链接列出,并带有新文件夹的选项
【发布时间】:2014-03-12 05:27:26
【问题描述】:

我正在尝试列出我的 WAMP 服务器的 WWW 目录中的所有文件夹,并可以选择为每个“组”子目录创建一个新文件夹作为超链接列表。 我知道下面的代码(见帖子底部)目前不符合 HTML 标准,我将在下面的代码按预期运行后添加页眉和页脚。

目前以下脚本的输出如下(见帖子底部):

www
    applied
        images
        NEW FOLDER
        templates
        NEW FOLDER
    NEW FOLDER
    coob
        includes
        NEW FOLDER
    NEW FOLDER
NEW FOLDER

当我希望输出采用以下格式时:

www
    applied
        images
        templates
        NEW FOLDER
    coob
        includes
        NEW FOLDER
    NEW FOLDER
NEW FOLDER

我知道要列出每个目录中的子目录,发现您需要递归函数。我已将“随机”文本 ">/>N_F-H:L:A-T_T<\<" 添加到数组中,因为它包含跨多个操作系统的目录名称中不允许的多个符号。 - 这是一个不应被视为目录并显示NEW FOLDER 超链接的事件。 我不明白为什么当您运行此脚本时 - NEW FOLDER 项目出现在子目录列表中的每个项目上,而不是每组子目录只出现一次。为什么会这样?如何才能达到预期的输出?

<style type="text/css">
  ul.dirlist, ul.dirlist li
  {
    list-style-type: none;
    padding-left: 1em;
  }
</style>
<?php
function ListFolder($path, $default_dir)
{
    $dircontents = scandir($path);
    $dircontents[] = ">/>N_F-H:L:A-T_T<\<";
    $dirref = str_replace($default_dir . DIRECTORY_SEPARATOR, "", $path);
    //Leave only the lastest folder name
    $dirpaths = explode(DIRECTORY_SEPARATOR, $path);
    $dirname = end($dirpaths);
    echo "<ul class='dirlist'>";
    echo "<li><a href=test.php?path=".$dirref.">".$dirname."</a>";
    foreach($dircontents as $key => $dir)
    {
        if($dir == ">/>N_F-H:L:A-T_T<\<")
        {
            echo "<li>NEW FOLDER</li>";
        }
        else
        {
            if($dir != "." AND $dir != "..")
            {
                if(is_dir($path . DIRECTORY_SEPARATOR . $dir))
                {
                    Test($path.DIRECTORY_SEPARATOR.$dir, $default_dir);
                }
            }
        }
    }
    //close list
    echo "</li>";
    echo "</ul>";
}

$www_dir = dirname(dirname(__FILE__));
$www_dir_parts = explode(DIRECTORY_SEPARATOR , $www_dir);

if(in_array('www', $www_dir_parts))
{
    $wwwkey = array_search('www', $www_dir_parts);
}
elseif(in_array('htdocs', $www_dir_parts))
{
    $wwwkey = array_search('htdocs', $www_dir_parts);
}
else
{
    $cancel = 1;
    //do nothing
}
//if the script hasn't been canceled
if(! isset($cancel))
{
    $i = 0;
    //default_dir as nothing to begin with
    $default_dir = "";
    $default_dir_www = "";
    while($i <= $wwwkey)
    {
        //create path to absolute directory path of www
        $default_dir .= $www_dir_parts[$i] . DIRECTORY_SEPARATOR;
        //increment i
        $i++;
    }
    $i = 0;
    while($i <= ($wwwkey - 1))
    {
        //create path to absolute directory path of www
        $default_dir_www .= $www_dir_parts[$i] . DIRECTORY_SEPARATOR;
        //increment i
        $i++;
    }
    $default_dir_www = rtrim($default_dir_www, DIRECTORY_SEPARATOR);
    $default_dir = rtrim($default_dir, DIRECTORY_SEPARATOR);
}
ListFolder($default_dir, $default_dir_www);
?>

【问题讨论】:

  • 先生,我很困惑。为什么不使用目录迭代器并从数组构建超链接? php.net/manual/en/class.directoryiterator.php
  • 我想在每组目录中添加一个带有NEW FOLDER 的超链接,但不知道是否可以使用 directoryiterator 类。

标签: php list recursion directory


【解决方案1】:

试试下面的函数

function ListFolder($path, $default_dir){
    $dircontents = scandir($path);
    $dirref = str_replace($default_dir . DIRECTORY_SEPARATOR, "", $path);
    $havesub = false;
    echo "<ul class='dirlist'>";
    foreach($dircontents as $key => $dir)
    {
        if($dir != "." AND $dir != "..")
        {
            if(is_dir($path . DIRECTORY_SEPARATOR . $dir))
            {
               echo "<li><a href=test.php?path=".$dirref.">".$dir."</a>";
               ListFolder($path.DIRECTORY_SEPARATOR.$dir, $default_dir);
               echo "</li>";
               $havesub = true;
            }
        }
     }
    echo ($havesub) ? "<li>NEW FOLDER</li>" : '';
    echo "</ul>";
}

【讨论】:

  • 这会在列表的最后列出一次NEW FOLDER,仅用于最顶层的目录 - 不幸的是,我需要该链接存在于每组子目录中,如示例中的问题。
  • 左边的列表是你生成的函数返回的内容。右边的列表是我所追求的。 someimage.com/E64bxFJ
  • 不知道你有没有看到我编辑了函数
  • 我看到你有,我正在使用上面代码框中的代码 - 它显示的内容如上面超链接的图片所示。
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2012-11-14
相关资源
最近更新 更多