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

发布于 2024-10-05 18:08:08 字数 604 浏览 7 评论 0原文

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

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

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

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir

,我想要

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf

除了 usortis_dir() 解决方案(我可以自己弄清楚) ,有没有一种快速有效的方法来做到这一点?

此评论的忍者走在正确的道路上 - 是那是最好的方法吗?

PHP manual for scandir: By default, the sorted order is alphabetical in ascending order.

I'm building a file browser (in Windows), so I want the addresses to be returned sorted by folder/file, then alphabetically in those subsets.

Example: Right now, I scan and output

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir

and I want

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf

Other than a usort and is_dir() solution (which I can figure out myself), is there a quick and efficient way to do this?

The ninja who wrote this comment is on the right track - is that the best way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

恬淡成诗 2024-10-12 18:08:08

这能给你你想要的吗?

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 的文件夹。

Does this give you what you want?

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);

Note that you can't glob('*.*') for files because it picks up folders named like.this.

清浅ˋ旧时光 2024-10-12 18:08:08

请尝试这个。一个简单的函数,用于按文件和文件夹(目录)对 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;
}

Please try this. A simple function to sort the PHP scandir results by files and folders (directories):

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;
}
空城缀染半城烟沙 2024-10-12 18:08:08

我迟到了,但我喜欢使用 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);
    }

}

我希望有人可能会发现这很有用。

I'm late to the party but I like to offer my solution with readdir() rather than with glob(). What I was missing from the solution is a recursive version of your solution. But with readdir it's faster than with glob.

So with glob it would look like this:

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

And this one is with readdir but has basically the same output:

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

}

I hope someone might find this useful.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文