【发布时间】: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