2

我有一段代码要修改以列出当前路径中文件夹和子文件夹中的所有文件。我找到了几种可能的解决方案。我实际上试图实现它们,但似乎没有任何效果,所以我不确定它们是否真的在工作,或者只是我错误地实现了它们。无论哪种方式,这是我当前的代码:

<?php 
        $currentdir = 'C:/xampp/htdocs/test/'; //change to your directory
        $dir = opendir($currentdir);
        echo '<select name="workout">';
            $file = preg_grep('/^([^.])/', scandir($dir));
            while($file = readdir($dir))
            {
                if ($file != "." && $file != "..") {
                    echo "<option value='$file'>$file</option>";
            }           
                else {
                    continue;
            }
        }
        echo '</select>';
        closedir($dir); 
?>

目前此代码显示结果:

$currentdir
   Option1
   Option2
   Option3
   SUB-FOLDER1
   SUB-FOLDER2

有人可以帮助我并向我展示如何使用现有代码编写/重写代码以显示文件夹和其他子文件夹中的文件,如下所示:

$currentdir
  Option1
  Option2
  Option3
    SUB-FOLDER1
      Option1
      Option2
      Option3
    SUB-FOLDER2
      Option1
      Option2
      Option3

我变得非常渴望解决方案,并提前感谢大家。

4

4 回答 4

4

虽然其他答案很好且正确,但也请允许我添加我的解决方案:

function dirToOptions($path = __DIR__, $level = 0) {
    $items = scandir($path);
    foreach($items as $item) {
        // ignore items strating with a dot (= hidden or nav)
        if (strpos($item, '.') === 0) {
            continue;
        }

        $fullPath = $path . DIRECTORY_SEPARATOR . $item;
        // add some whitespace to better mimic the file structure
        $item = str_repeat('&nbsp;', $level * 3) . $item;
        // file
        if (is_file($fullPath)) {
            echo "<option>$item</option>";
        }
        // dir
        else if (is_dir($fullPath)) {
            // immediatly close the optgroup to prevent (invalid) nested optgroups
            echo "<optgroup label='$item'></optgroup>";
            // recursive call to self to add the subitems
            dirToOptions($fullPath, $level + 1);
        }
    }

}

echo '<select>';
dirToOptions();
echo '</select>';

它使用递归调用来获取子项。请注意,我在每个项目之前添加了一些空格以更好地模仿文件结构。我也立即关闭了它optgroup,以防止以嵌套optgroup元素结束,这是无效的 HTML。

于 2014-07-31T20:57:34.537 回答
1

查找指定目录下的所有文件和文件夹。

function scanDirAndSubdir($dir, &$out = []) {
    $sun = scandir($dir);

    foreach ($sun as $a => $filename) {
        $way = realpath($dir . DIRECTORY_SEPARATOR . $filename);
        if (!is_dir($way)) {
            $out[] = $way;
        } else if ($filename != "." && $filename != "..") {
            scanDirAndSubdir($way, $out);
            $out[] = $way;
        }
    }

    return $out;
}

var_dump(scanDirAndSubdir('C:/xampp/htdocs/test/'));

样本 :

array (size=4)
  0 => string 'C:/xampp/htdocs/test/text1.txt' (length=30)
  1 => string 'C:/xampp/htdocs/test/text1.txt' (length=30)
  2 => string 'C:/xampp/htdocs/test/subfolder1/text8.txt' (length=41)
  3 => string 'C:/xampp/htdocs/test/subfolder4/text9.txt' (length=41)
于 2015-11-05T16:59:16.373 回答
0

用于DirectoryIterator查看文件夹这里是我的方法

$di = new DirectoryIterator("/dir");
foreach($di as $dir){
    if ($dir->isDot()) continue;
    echo "<option value='", $dir->getFilename(), "'>", $dir->getFilename(), "</option>";
}

无论如何也要查看子目录

$ri = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($ri as $dir){
    if ($dir->isDot()) continue;
    echo "<option value='", $dir->getFilename(), "'>", $dir->getFilename(), "</option>";
}
于 2014-07-31T20:06:40.820 回答
0

如果您不想使用上述语句,那么这是另一种选择:

    <?php
function listdir($currentdir){
    $dir = opendir($currentdir);
    $file = readdir($dir);
    echo "<optgroup label='$currentdir'>";
    do {
        if (is_dir($currentdir."/".$file) && $file != "." && $file != ".."){
            listdir($currentdir."/".$file);
            echo $currentdir."/".$file;
        } else if($file != "." && $file != "..") {
            echo "<option value='$file'>$file</option>";
        } else {
            continue;
        }
    } while($file = readdir($dir));
    echo "</optgroup>";
    closedir($dir); 
}
echo '<select name="workout">';
listdir('/var/www'); //change to your directory
echo '</select>';
?>
于 2014-07-31T20:23:47.017 回答