代码之家  ›  专栏  ›  技术社区  ›  Greg

对PHP迭代器排序

  •  12
  • Greg  · 技术社区  · 16 年前

    是否有一种简单的方法来对PHP中的迭代器进行排序(而不只是将其全部拉入数组并对其进行排序)。

    我举的具体例子是 DirectoryIterator 但是对于任何迭代器都有一个通用的解决方案是很好的。

    $dir = new DirectoryIterator('.');
    foreach ($dir as $file)
        echo $file->getFilename();
    

    我希望能够按各种标准(文件名、大小等)对这些文件进行排序。

    3 回复  |  直到 10 年前
        1
  •  5
  •   andy.gurin    16 年前

    没有办法做到这一点。迭代器应该“迭代器”遍历列表。您必须对底层列表进行排序以实现所需的行为。

    顺便说一下,这里更完整地提到了SPL: http://www.php.net/~helly/php/ext/spl/

        2
  •  6
  •   Luís Lopes    10 年前

    对于那些5年后在这里结束的人:

    如果使迭代器成为arrayIterator的扩展,则可以使用

    arrayIterator::uasort(按值排序)和arrayIterator::uksort(按键排序)

    http://php.net/manual/en/arrayiterator.uasort.php

    http://php.net/manual/en/arrayiterator.uksort.php

        3
  •  4
  •   bishop    14 年前

    您必须减少使用迭代器_to_array(),然后使用uasort()。而且,在我的性能测试中,速度足够快。

    对于您的具体示例,我知道使用迭代器的最紧凑的方法如下:

    // get (recursively) files matching a pattern, each file as SplFileInfo object
    $matches = new RegexIterator(
                   new RecursiveIteratorIterator(
                       new RecursiveDirectoryIterator('/path/to/files/')
                   ),
                   '/(\.php|\.ini|\.xml)$/i'
                );
     $files = iterator_to_array($matches);
    
    // sort them by name
    uasort($files, create_function('$a,$b', 'return strnatcasecmp($a->getFilename(), $b->getFilename());'));