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 如何按字母顺序对目录内容进行排序,子目录显示在普通文件之前?_Php_Sorting_Readdir - Fatal编程技术网

Php 如何按字母顺序对目录内容进行排序,子目录显示在普通文件之前?

Php 如何按字母顺序对目录内容进行排序,子目录显示在普通文件之前?,php,sorting,readdir,Php,Sorting,Readdir,我需要按字母升序对目录的内容进行排序。即使目录名按字母顺序出现在文件名之后,目录也必须出现在文件之前。与文件资源管理器一样,它们列出已排序的目录,然后列出已排序的文件 我正在使用以下代码,该代码按字母顺序为我提供了一个排序列表,但它不会首先推进目录: if($handler = opendir($dir)) { while (($sub = readdir($handler)) !== FALSE) { // ... } closedir(

我需要按字母升序对目录的内容进行排序。即使目录名按字母顺序出现在文件名之后,目录也必须出现在文件之前。与文件资源管理器一样,它们列出已排序的目录,然后列出已排序的文件

我正在使用以下代码,该代码按字母顺序为我提供了一个排序列表,但它不会首先推进目录:

if($handler = opendir($dir))
{
    while (($sub = readdir($handler)) !== FALSE)
    {
        // ...
    }    
    closedir($handler); 
}

像这样的东西应该有用

$contents = array();
while (($sub = readdir($handler)) !== FALSE) {
    if ($sub !== '.' && $sub !== '..') {
        $contents[] = array('is_dir' => is_dir($sub), 'name' => $sub);
    }    
}   

closedir($handler); 

usort($contents, function($a, $b) {
    if ($a['is_dir'] && !$b['is_dir']) {
        return -1;
    }
    else if (!$a['is_dir'] && $b['is_dir']) {
        return 1;
    }
    // they are either both files or both directories
    else {
        return strcmp($a['name'], $b['name']);
    }
});

foreach ($contents as $c) { 
    echo $c['name'] . PHP_EOL; 
}
使用以下目录进行测试目录没有扩展名:

输出:

1
fooo
test
findp.php
simple_html_dom.php
test.txt

实现这一点的一种简单方法是使用[is_filepath,path]这样的对填充数组,排序此数组php将自动按第一个元素排序,然后按第二个元素排序,最后删除is_文件位:

酷,我不知道sort对非定标器数组值有效。
1
fooo
test
findp.php
simple_html_dom.php
test.txt
$path = 'somedir';
$dir = [];

// populate
foreach(glob("$path/*") as $f)
    $dir []= [is_file($f), $f];

// sort
sort($dir);

// remove
$dir = array_map('end', $dir);

// PROFIT
print_r($dir);