PHP opendir()函数仅列出文件夹

18

我想使用opendir()函数列出特定文件夹(即/www/site/)中仅为文件夹的内容,同时排除文件以及在Linux文件夹列表中出现的'.'和'..'文件夹。 我该如何实现这个功能?

6个回答

22
foreach(glob('directory/*', GLOB_ONLYDIR) as $dir) {
    $dir = str_replace('directory/', '', $dir);
    echo $dir;
}

您可以使用带有GLOB_ONLYDIR的简单通配符,然后过滤结果目录。


21

查看PHP文档中有关readdir()函数的内容,其中包含了一个针对此问题的示例。

为了完整起见:

<?php
if ($handle = opendir('.')) {
    $blacklist = array('.', '..', 'somedir', 'somefile.php');
    while (false !== ($file = readdir($handle))) {
        if (!in_array($file, $blacklist)) {
            echo "$file\n";
        }
    }
    closedir($handle);
}
?>

只需将 opendir('.') 更改为您的目录,例如 opendir('/www/sites/'),并更新 $blacklist 以包含您不希望输出的文件或目录的名称。


2
这只过滤 ...,而不是其他目录。 - phihag
谢谢,这个可行...我一直在看opendir的手册,没有看到readdir的页面。 - Jeff Thomas
@Price,不用担心。很高兴能帮到你。@downvoter,您想发表意见吗? - Jason McCreary
2
@Prince:通常手册页面上会有相关函数的链接。为了完整性,点击这些链接通常是值得的。 - hakre

8
function scandir_nofolders($d) {
   return array_filter(scandir($d), function ($f) use($d) {
       return ! is_dir($d . DIRECTORY_SEPARATOR . $f);
   });
}

这个函数返回一个数组,你可以遍历或存储在其他地方,这正是99.37%使用opendir的程序员所需的。

过滤器失败是因为在匿名函数中,$dir不在作用域内,因此显示为空。不确定如何解决这个问题。 - Yarin
@Yarin 哎呀,你说得对,这里完全缺少 use($d)。已更正。 - phihag

6

仅列出文件夹(目录):

<?php
$Mydir = ''; ### OR MAKE IT 'yourdirectory/';

foreach(glob($Mydir.'*', GLOB_ONLYDIR) as $dir) {
    $dir = str_replace($Mydir, '', $dir);
    echo $dir;
}
?>

1
你还可以使用echo basename($dir);代替str_replace。 - David Beck

3
尝试使用glob('*')函数。
    <?php
    $dirs = array_filter(glob('*'), 'is_dir');
    $i = 1;
    foreach ($dirs as $value) {
        echo $i . '. &nbsp; <a href = "http://localhost/' . $value . '" target = "_blank">' . $value . '</a><br>';
        $i++;
    }
    ?>

上述代码对我有用,可以列出当前目录中的文件夹,我进一步开发了代码,在同一浏览器中打开每个文件夹的新选项卡。这只显示目录。

2

这也可以用于表单中创建文件夹名称的下拉列表(这里是图像文件夹)。确保用户上传图像时将其推送到正确的文件夹中 :-)

<select name="imgfolder">
    <option value="genimage">General Image</option>
    <?php
    $Mydir = '../images/'; //  use 'anydirectory_of_your_choice/';

    foreach(glob($Mydir.'*', GLOB_ONLYDIR) as $dir) {
    $dirname =  basename($dir) ;
    echo '<option value="' . $dirname . '">' . $dirname . '</option>'  ; 
    }
    ?>
    </select>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接