按字母顺序对glob进行排序,但首先是目录

时间:2014-05-18 19:58:39

标签: php sorting

使用glob(),我获得了目录中的文件和目录列表。

我想对此进行排序,因此我使用了natcasesort()。然后我想先放置所有目录,所以我使用了usort()

$files = glob($directory.'/*');
natcasesort($files);
usort($files, function ($a, $b) {
    return ((int) is_dir($b)) - ((int) is_dir($a));
});
var_dump($files);

第一种工作正常,但在第二次排序过程中,我失去了自然排序,似乎没有什么顺序。我有点希望如果一个sort函数返回0,它会保留现有的顺序,但现在我不太确定。

我如何完成这样的任务,或者我是否需要手动使用两个foreach语句来获取数组,一个用于目录,一个用于文件?

1 个答案:

答案 0 :(得分:2)

您需要一步对整个数组进行排序:

$files = glob($directory.'/*');
usort($files, function ($a, $b) {
    $aIsDir = is_dir($a);
    $bIsDir = is_dir($b);
    if ($aIsDir === $bIsDir)
        return strnatcasecmp($a, $b); // both are dirs or files
    elseif ($aIsDir && !$bIsDir)
        return -1; // if $a is dir - it should be before $b
    elseif (!$aIsDir && $bIsDir)
        return 1; // $b is dir, should be before $a
});
var_dump($files);