如何使用普通文件之前出现的子目录按字母顺序对目录内容进行排序?

时间:2014-11-16 20:42:42

标签: php sorting readdir

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

我正在使用下面的代码,它按字母顺序给出了一个排序列表,但它不会首先推进目录:

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

2 个答案:

答案 0 :(得分:3)

实现这一目标的直接方法是使用[is_file(path), path]这样的对填充数组,对此数组进行排序(php将自动按第一个元素排序,然后按第二个元素排序)最后删除{{1} }位:

is_file

答案 1 :(得分:1)

这样的事情应该有效

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

使用以下目录进行测试(目录没有扩展名):

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

输出:

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