有没有办法让glob()只有文件?

时间:2012-12-29 17:53:17

标签: php glob directory-browsing

我知道glob可以查找文件夹中的所有文件或仅查找所有目录:

echo "All files:\n";
$all = glob("/*");
var_dump($all);

echo "Only directories\n";
$dirs = glob("/*", GLOB_ONLYDIR);
var_dump($dirs);

但我没有找到能够有效地在一行中找到文件的东西。

$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR));

运行良好,但两次读取目录(即使有some optimizations使第二次浏览更快)。

5 个答案:

答案 0 :(得分:52)

我终于找到了解决方案:

echo "Only files\n";
$files = array_filter(glob("/*"), 'is_file');
var_dump($files);

但请注意,array_filter会保留数字键:如果需要重新索引数组,请使用array_values

答案 1 :(得分:4)

您可以使用GLOB_BRACE将文档与已知文件扩展名列表进行匹配:

$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE);

请参阅:http://www.electrictoolbox.com/php-glob-find-files/

答案 2 :(得分:4)

有一种更简单的方法,只需一行:

$files = glob("/path/to/directory/*.{*}", GLOB_BRACE);

{*} 表示所有文件结尾,因此每个文件都有,但没有文件夹!

答案 3 :(得分:1)

其他解决方案:

$files = glob('../{,.}*', GLOB_BRACE);
foreach ($files as $i => $file) {
    if (is_dir($file)) {
        unset($files[$i]);
    }
}

或者:

$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK);
foreach ($files as $i => $file) {
    if ($file[ strlen($file) - 1 ] == '/') {
        unset($files[$i]);
    }
}

两者都保留数字键,因此您可能希望re-index

P.S。如果您想要get hidden files,也必须使用{,.}*', GLOB_BRACE

答案 4 :(得分:-10)

$all = glob("/*.*");

这将以“。”列出所有内容。在文件名之后。所以基本上都是所有文件。