有没有一种简单的方法可以在 PHP 中对迭代器进行排序(而不是将其全部拉入数组并对其进行排序)。
我的具体示例是DirectoryIterator但如果有一个适用于任何迭代器的解决方案会很好。
$dir = new DirectoryIterator('.');
foreach ($dir as $file)
echo $file->getFilename();
我希望能够按各种标准(文件名、大小等)对这些进行排序
有没有一种简单的方法可以在 PHP 中对迭代器进行排序(而不是将其全部拉入数组并对其进行排序)。
我的具体示例是DirectoryIterator但如果有一个适用于任何迭代器的解决方案会很好。
$dir = new DirectoryIterator('.');
foreach ($dir as $file)
echo $file->getFilename();
我希望能够按各种标准(文件名、大小等)对这些进行排序
没有办法做到这一点。迭代器应该“迭代”整个列表。您必须对基础列表进行排序以实现所需的行为。
顺便说一句,更完整的 SPL 参考在这里: http ://www.php.net/~helly/php/ext/spl/
您必须使用 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());'));
对于5年后在这里结束的人:
如果您使 Iterator 成为 ArrayIterator 的扩展,您可以使用
ArrayIterator::uasort(按值排序)和 ArrayIterator::uksort(按键排序)