Php 如何使用scandir列出文件夹和子文件夹中的所有文件,并将其显示为“选择”中的选项?

Php 如何使用scandir列出文件夹和子文件夹中的所有文件,并将其显示为“选择”中的选项?,php,web,web-development-server,Php,Web,Web Development Server,我有一段代码要修改,以列出当前路径中文件夹和子文件夹中的所有文件。我找到了几种可能的解决办法。我试图实际实现它们,但似乎什么都不起作用,所以我不确定它们是否真的起作用,或者只是我实现了它们。无论哪种方式,这都是我当前的代码: <?php $currentdir = 'C:/xampp/htdocs/test/'; //change to your directory $dir = opendir($currentdir); echo '&l

我有一段代码要修改,以列出当前路径中文件夹和子文件夹中的所有文件。我找到了几种可能的解决办法。我试图实际实现它们,但似乎什么都不起作用,所以我不确定它们是否真的起作用,或者只是我实现了它们。无论哪种方式,这都是我当前的代码:

<?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
      Option1
      Option2
      Option3
    SUB-FOLDER2
      Option1
      Option2
      Option3

我非常渴望找到一个解决方案,并提前向大家表示感谢。

使用
DirectoryIterator
查找文件夹这是我的方法

$di = new DirectoryIterator("/dir");
foreach($di as $dir){
    if ($dir->isDot()) continue;
    echo "<option value='", $dir->getFilename(), "'>", $dir->getFilename(), "</option>";
}
$di=新的目录迭代器(“/dir”);
foreach($di作为$dir){
如果($dir->isDot())继续;
echo“$dir->getFilename(),”;
}
无论如何,也可以查看子目录

$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>";
}
$ri=new recursiveiterator(new recursivedirectoryinterator($path),recursiveiterator::SELF_FIRST);
外汇($ri作为$dir){
如果($dir->isDot())继续;
echo“$dir->getFilename(),”;
}

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

    <?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>';
?>

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

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>';
函数目录选项($path=\u目录,$level=0){
$items=scandir($path);
foreach($items作为$item){
//忽略带点分层的项目(=隐藏或导航)
如果(STRPO($item,'.')==0){
继续;
}
$fullPath=$path.DIRECTORY\u SEPARATOR.$item;
//添加一些空白以更好地模拟文件结构
$item=str_repeat(“”,$level*3)。$item;
//文件
if(is_文件($fullPath)){
回显“$item”;
}
//迪尔
else if(is_dir($fullPath)){
//立即关闭optgroup以防止嵌套的optgroup(无效)
回声“;
//递归调用self以添加子项
目录选项($fullPath,$level+1);
}
}
}
回声';
dirToOptions();
回声';

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

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

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/'));
样本:
我认为您的问题是PHP不会使用C:\作为查看的地方。毕竟,它是在服务器上运行的。它不会看到本地文件系统。它应该只使用来自站点根目录的相对路径。如果您想检查文件是否为目录,那么有一个函数用于此。你查过了吗?我正在运行本地服务器,所以它可以显示当前路径中的文件和文件夹,但不能显示其中的子文件夹和文件@我确实使用foreach找到了相应的代码,但正如我在问题中所说的,我可能没有在代码中很好地实现。那么,如果文件是一个目录,我怎么才能把代码中的那个部分隐藏起来呢?你应该考虑使用'C:/XAMPP/HTDOCS/Test/]来代替。谢谢你,AndrasGyomrey,我已经按照你的建议修改了代码。检查你的语法高亮显示;这里有些不对劲,如果我没弄错的话。我应该用你的代码完全替换我的代码,除了在第一行留下“$currentdir”?如果是,那么我将收到以下错误:致命错误:在第29行的C:\xampp\htdocs\test\index.php中调用未定义的方法SplFileInfo::isDot()。我做错了什么?我用$currentdir替换了$path,对吗?它还告诉我在最后一行中有一个额外的“标记”,因此我删除了它,并将“>”改为“>”,首先将
递归迭代器::SELF
标记替换为
文件系统发射器::KEY _AS_路径名|文件系统发射器::CURRENT _AS_SELF
感谢您在这方面的输入。我还有一个问题,我相信这是一个小小的调整。在您输出
的行中,我添加了
$path
的值,因为我需要在提交表单时在新文件中输出该信息。当我提交表单时,该选项的输出值显示完整路径
C:/xampp/htdocs/test/
,然后显示我选择的项目;类似这样的东西:
C:/xampp/htdocs/test/sub-folder/SelectedOption
。现在,最好的方法是什么来修剪它,使选项值的输出只显示子文件夹和文件,而不显示完整路径;类似这样的东西:
子文件夹/SelectedOption
?非常感谢。编辑:我的意思是
$fullpath
而不是
$path
您的函数与我使用的另一个函数类似。您忘记更改“getDirRecursive”,因此您的函数无法工作。
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)