Вопрос
Есть ли простой способ сортировки итератора в PHP (не просто извлекая все это в массив и сортируя его).
У меня есть конкретный пример DirectoryIterator , но было бы неплохо иметь общее решение для любого итератор.
$dir = new DirectoryIterator('.');
foreach ($dir as $file)
echo $file->getFilename();
Я хотел бы иметь возможность сортировать их по различным критериям (имя файла, размер и т. д.)
Решение
Нет способа сделать это. Итератор должен "повторять" через список. Вы должны отсортировать базовый список для достижения необходимого поведения.
Кстати, более полная ссылка на SPL находится здесь: http://www.php.net/~helly/php/ext/spl/ р>
Другие советы
Для тех, кто попал сюда через 5 лет:
Если вы сделаете Iterator расширением ArrayIterator, вы можете использовать
ArrayIterator :: uasort (для сортировки по значению) и ArrayIterator :: uksort (для сортировки по ключу)
Вы должны будете уменьшить использование 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());'));