【问题标题】:PHP Sorting the list of directories relative to the path (?)PHP对相对于路径的目录列表进行排序(?)
【发布时间】:2018-03-26 00:07:00
【问题描述】:

遇到问题不知道怎么描述,直接上代码:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./', RecursiveDirectoryIterator::SKIP_DOTS));
$files = new RegexIterator($iterator, '/\.(html|php|phtml|storage|tmp|txt|ini)*$/i');

foreach($files as $file){
    echo $file->getRealpath();
}

他收到类似的东西:

C:\xampp\htdocs\includes\test\aa.txt
C:\xampp\htdocs\includes\test\cc.txt
C:\xampp\htdocs\includes\test\ccc.txt
C:\xampp\htdocs\includes\test\file.txt
C:\xampp\htdocs\includes\test\test.php
C:\xampp\htdocs\includes\test\test2.php
C:\xampp\htdocs\index.php
C:\xampp\htdocs\file.txt
C:\xampp\htdocs\sth.txt

我想收到这样的东西:

C:\xampp\htdocs\file.txt
C:\xampp\htdocs\index.php
C:\xampp\htdocs\sth.txt
C:\xampp\htdocs\includes\test\aa.txt
C:\xampp\htdocs\includes\test\cc.txt
C:\xampp\htdocs\includes\test\ccc.txt
C:\xampp\htdocs\includes\test\file.txt
C:\xampp\htdocs\includes\test\test.php
C:\xampp\htdocs\includes\test\test2.php

我怎样才能收到这样的东西?提前感谢您的每一个回答。

【问题讨论】:

    标签: php file sorting


    【解决方案1】:

    @Ghost 略微改进的版本,用于处理子结构内的排序:

    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./', RecursiveDirectoryIterator::SKIP_DOTS));
    $files = new RegexIterator($iterator, '/\.(html|php|phtml|storage|tmp|txt|ini)*$/i');
    $data = array();
    foreach($iterator as $file) {
        $depth = $files->getDepth(); // get depth
        $data[$depth][] = $file->getRealpath(); // push depth inside another dimension with the file
    }
    
    // this is necessary that items within the depth are sorted correctly, first sort by key (the depth) than sort by name
    ksort($data);
    foreach ($data as $depthArray){
        sort($depthArray);
    }
    
    $data = call_user_func_array('array_merge', $data); // flatten all items
    // use data
    

    当目录包含很多子目录时,这仍然会出现问题。这个例子:

    a\b.html
    downtheway\a.html
    a\a.html
    a\sub1\c.sorted
    

    会这样解决:

    a\b.html
    a\a.html
    downtheway\a.html // wrong
    a\sub1\c.html
    

    因为算法只考虑深度和

    a\sub1\c.html
    

    downtheway\a.html
    

    @Trawlr:这对您的用例是否正确或应该像这样排序:

    a\b.html
    a\a.html
    a\sub1\c.html
    downtheway\a.html
    

    旧答案并非 OP 所要求的。

    仅对数组使用常规的 sort。这应该没有问题。

    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./', RecursiveDirectoryIterator::SKIP_DOTS));
    $files = new RegexIterator($iterator, '/\.(html|php|phtml|storage|tmp|txt|ini)*$/i');
    
    $array = array();
    foreach($files as $file){
        $array[] = $file->getRealpath();
    }
    sort($array, SORT_STRING);
    //output array
    

    您还可以将SORT_STRINGSORT_FLAG_CASE 结合使用以忽略字符串的大小写。看起来像这样:

    sort($array, SORT_STRING | SORT_FLAG_CASE );
    

    【讨论】:

    • 不起作用,但是usort功能更接近于解决我的问题,不过谢谢解答。
    【解决方案2】:

    如果我正确理解您的问题,您想按文件深度对它们进行排序,您可以使用->getDepth 方法获取当前深度,并将它们分配给文件的每个组。首先将它们分组,最后将它们合并,然后您就可以将它们排成一行。

    这就是想法:

    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./', RecursiveDirectoryIterator::SKIP_DOTS));
    $files = new RegexIterator($iterator, '/\.(html|php|phtml|storage|tmp|txt|ini)*$/i');
    $data = array();
    foreach($iterator as $file) {
        $depth = $files->getDepth(); // get depth
        $data[$depth][] = $file->getRealpath(); // push depth inside another dimension with the file
    }
    
    $data = call_user_func_array('array_merge', $data); // flatten all items
    

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 2011-08-06
      • 2011-12-11
      • 2019-04-25
      • 2011-05-27
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多