PHP scandir结果:按文件夹文件排序,然后按字母顺序排序

时间:2010-12-02 05:01:41

标签: php sorting scandir

scandir的PHP手册:默认情况下,排序顺序按字母顺序排列

我正在构建一个文件浏览器(在Windows中),所以我希望按文件夹/文件排序返回地址,然后按字母顺序返回这些子集。

示例:现在,我扫描并输出

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir

我想要

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf

除了usortis_dir()解决方案(我可以自己弄清楚)之外,还有一种快速有效的方法吗?

this comment的忍者走在正确的轨道上 - 这是最好的方式吗?

3 个答案:

答案 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);
    }

}

我希望有人可能觉得这很有用。