Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP scandir结果:按文件夹文件排序,然后按字母顺序排序_Php_Sorting_Scandir - Fatal编程技术网

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

PHP scandir结果:按文件夹文件排序,然后按字母顺序排序,php,sorting,scandir,Php,Sorting,Scandir,PHP手册:默认情况下,排序顺序为字母升序 我正在构建一个文件浏览器(在Windows中),因此我希望返回的地址按文件夹/文件排序,然后按这些子集的字母顺序排列 示例:现在,我扫描并输出 Aardvark.txt BarDir BazDir Dante.pdf FooDir 我想要 BarDir BazDir FooDir Aardvark.txt Dante.pdf 除了usort和is_dir()解决方案(我自己可以找到)之外,有没有一种快速有效的方法 写作的忍者在正确的轨道上-这是最好

PHP手册:默认情况下,排序顺序为字母升序

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

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

Aardvark.txt
BarDir
BazDir
Dante.pdf
FooDir
我想要

BarDir
BazDir
FooDir
Aardvark.txt
Dante.pdf
除了
usort
is_dir()
解决方案
(我自己可以找到)之外,有没有一种快速有效的方法


写作的忍者在正确的轨道上-这是最好的方式吗?

这能给你想要的吗

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('*.')
,因为它会拾取名为
的文件夹,例如

我来晚了,但我喜欢用
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));
        }
    }
}
函数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=数组_diff($all2,$filter); foreach(全部为$target){ 回显“$target
”; 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);
    }

}
函数myreaddir($target,$level=0){ $ignore=array(“cgi-bin”,“Thumbs.db”); $dirs=array(); $files=array(); if(is_dir($target)){ 如果($dir=opendir($target)){ while(($file=readdir($dir))!==false){ 如果(!in_数组($file,$ignore)){ if(is_dir(“$target/$file”)){ 数组_push($dirs,“$target/$file”); } 否则{ 数组_push($files,“$target/$file”); } } } //分类 排序($dirs); 排序($文件); $all=array_unique(array_merge($dirs,$files)); foreach(全部为$value){ 回显“$value
”; if(is_dir($value)){ myreaddir($value,($level+1)); } } } closedir($dir); } }
我希望有人会觉得这个有用。

请尝试一下。一个按文件和文件夹(目录)对PHP scandir结果排序的简单函数:


发布你自己发现的东西,然后我们可以告诉你是否可以改进。@alex-我不想浪费时间自己去发现,如果有一种更有效的方法,我会错过的。如果没有好的答案,我可以从手册中复制一些东西。我的解决方案已经编辑过了-你可能想编辑你的问题来反映这一点。@alex-是的,这是一个非常优雅的解决方案。你认为它与usort相比怎么样?@Steve只要你的文件系统按照你想要的顺序返回它们,它就会快得多。我实际上不做任何分类。对你有用吗?编辑做了一些编辑。让我知道它是否对你有效(在我的测试中对我有效)。@alex-稍作调整,现在完成。例如,
$filepath='path/to/dir/*'。将在工作时更新问题和最终确定的代码。@alex为一个很棒的新函数干杯并+1,以前不知道
blob
。@Steve我想你指的是glob。Blob什么也做不了。(虽然它应该)比上面的解决方案更好,它“在我的机器上不工作”:-。
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;
}