排序PHP迭代器

时间:2008-10-30 18:42:22

标签: php iterator

是否有一种简单的方法可以在PHP中对迭代器进行排序(不需要将其全部放入数组并对其进行排序)。

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

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

我希望能够按照各种标准(文件名,大小等)对它们进行排序

3 个答案:

答案 0 :(得分:6)

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

如果您将Iterator作为ArrayIterator的扩展,则可以使用

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

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

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

答案 1 :(得分:5)

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

顺便说一下,对SPL的更完整引用如下: http://www.php.net/~helly/php/ext/spl/

答案 2 :(得分:4)

你必须减少使用iterator_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());'));