【问题标题】:How to sort the contents of a directory alphabetically with sub directorys appearing before normal files?如何按字母顺序对目录的内容进行排序,子目录出现在普通文件之前?
【发布时间】:2014-11-16 20:42:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: php sorting readdir


    【解决方案1】:

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

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

    【讨论】:

    • 酷,我不知道sort 工作于非缩放数组值。
    【解决方案2】:

    这样的东西应该可以工作

    $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
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2015-09-12
      • 2011-09-23
      • 2015-02-02
      • 1970-01-01
      • 2012-12-11
      相关资源
      最近更新 更多