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