scandir的PHP手册:默认情况下,排序顺序按字母顺序排列。
我正在构建一个文件浏览器(在Windows中),所以我希望按文件夹/文件排序返回地址,然后按字母顺序返回这些子集。
示例:现在,我扫描并输出
Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir
我想要
BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf
除了usort
和is_dir()
解决方案(我可以自己弄清楚)之外,还有一种快速有效的方法吗?
写this comment的忍者走在正确的轨道上 - 这是最好的方式吗?
答案 0 :(得分:5)
这会给你你想要的吗?
function readDir($path) {
// Make sure we have a trailing slash and asterix
$path = rtrim($path, '/') . '/*';
$dirs = glob($path, GLOB_ONLYDIR);
$files = glob($path);
return array_unique(array_merge($dirs, $files));
}
$path = '/path/to/dir/';
readDir($path);
请注意,您无法glob('*.*')
获取文件,因为它会选择名为like.this
的文件夹。
答案 1 :(得分:2)
请试试这个。一个简单的函数,用于按文件和文件夹(目录)对PHP scandir 进行排序:
function sort_dir_files($dir)
{
$sortedData = array();
foreach(scandir($dir) as $file)
{
if(is_file($dir.'/'.$file))
array_push($sortedData, $file);
else
array_unshift($sortedData, $file);
}
return $sortedData;
}
答案 2 :(得分:0)
我迟到了,但我喜欢用readdir()
而不是glob()
提供我的解决方案。我在解决方案中遗漏的是您的解决方案的递归版本。但是使用readdir比使用glob更快。
因此对于glob,它看起来像这样:
function myglobdir($path, $level = 0) {
$dirs = glob($path.'/*', GLOB_ONLYDIR);
$files = glob($path.'/*');
$all2 = array_unique(array_merge($dirs, $files));
$filter = array($path.'/Thumbs.db');
$all = array_diff($all2,$filter);
foreach ($all as $target){
echo "$target<br />";
if(is_dir("$target")){
myglobdir($target, ($level+1));
}
}
}
这个是readdir,但输出基本相同:
function myreaddir($target, $level = 0){
$ignore = array("cgi-bin", ".", "..", "Thumbs.db");
$dirs = array();
$files = array();
if(is_dir($target)){
if($dir = opendir($target)){
while (($file = readdir($dir)) !== false){
if(!in_array($file, $ignore)){
if(is_dir("$target/$file")){
array_push($dirs, "$target/$file");
}
else{
array_push($files, "$target/$file");
}
}
}
//Sort
sort($dirs);
sort($files);
$all = array_unique(array_merge($dirs, $files));
foreach ($all as $value){
echo "$value<br />";
if(is_dir($value)){
myreaddir($value, ($level+1));
}
}
}
closedir($dir);
}
}
我希望有人可能觉得这很有用。