2014-02-13 19 views
0

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

目前发生以下情况,如下脚本的输出(看帖子的底部):

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); 
?> 
+0

我很困惑,先生。为什么不使用目录迭代器,而非和建设该数组中的超链接? http://www.php.net/manual/en/class.directoryiterator.php – briosheje

+0

我想添加一个带有'NEW FOLDER'的超链接到每个目录组,并且不知道是否可以使用directoryiterator类。 – Justice

回答

0

试试下面的功能,而不是

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>"; 
} 
+0

这个列表只列出最后一个目录的最后一个“NEW FOLDER”,不幸的是我需要链接存在于每个子目录组中,就像问题中的例子一样。 – Justice

+0

@Justice - 见上面更新的功能 – Lepanto

+0

左边的列表是您生成的函数返回的内容。右边的列表是我所追求的。 http://someimage.com/E64bxFJ – Justice

相关问题