Доступно несколько вариантов, которые вы можете использовать для сортировки итератора так или иначе. Лучший вариант будет очень зависеть от того, как вы хотите манипулировать содержимым итератора, что вы хотите выбраться из итератора, и действительно, сколько или мало итератора вы действительно хотите/нуждаетесь.
Подходы могут отличаться; используя классы, такие как SplHeap
(или Min
, Max
), SplPriorityQueue
(возможно, для таких вещей, как размер файла), или просто обертывание вашего итератора чем-то вроде ArrayObject
, который может сортировать собственное содержимое.
В качестве примера я приведу SplHeap
. Так как вы хотите, чтобы организовать все содержимое RecursiveDirectoryIterator
в алфавитном порядке, то можно было бы использовать что-то вроде следующего:
class ExampleSortedIterator extends SplHeap
{
public function __construct(Iterator $iterator)
{
foreach ($iterator as $item) {
$this->insert($item);
}
}
public function compare($b,$a)
{
return strcmp($a->getRealpath(), $b->getRealpath());
}
}
$dit = new RecursiveDirectoryIterator("./path/to/files");
$rit = new RecursiveIteratorIterator($dit);
$sit = new ExampleSortedIterator($rit);
foreach ($sit as $file) {
echo $file->getPathname() . PHP_EOL;
}
Порядок сортировки в алфавитном порядке, смешивая файлы и папки:
./apple
./apple/alpha.txt
./apple/bravo.txt
./apple/charlie.txt
./artichoke.txt
./banana
./banana/aardvark.txt
./banana/bat.txt
./banana/cat.txt
./beans.txt
./carrot.txt
./cherry
./cherry/amy.txt
./cherry/brian.txt
./cherry/charlie.txt
./damson
./damson/xray.txt
./damson/yacht.txt
./damson/zebra.txt
./duck.txt
Возможный дубликат [после использования $ files = new DirectoryIterator() в PHP, как вы сортируете элементы?] (Http://stackoverflow.com/questions/1076881/after-using-files-new-directoryiterator-in- php-how-do-you-sort-the-items) –
[salathe/spl-examples - Сортировочные итераторы] (https://github.com/salathe/spl-examples/wiki/Sorting-Iterators) – hakre