Сортировка PHP итераторов - PullRequest
       10

Сортировка PHP итераторов

12 голосов
/ 30 октября 2008

Существует ли простой способ сортировки итератора в PHP (не просто извлекая все это в массив и не сортируя его).

У меня есть конкретный пример DirectoryIterator , но было бы неплохо иметь общее решение для любого итератора.

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

Я бы хотел отсортировать их по различным критериям (имя файла, размер и т. Д.)

Ответы [ 3 ]

6 голосов
/ 10 ноября 2014

Для тех, кто окажется здесь через 5 лет:

Если вы сделаете Iterator расширением ArrayIterator, вы можете использовать

ArrayIterator :: uasort (для сортировки по значению) и ArrayIterator :: uksort (для сортировки по ключу)

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

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

5 голосов
/ 30 октября 2008

Нет способа сделать это. Итератор должен «перебирать» список. Вы должны отсортировать базовый список для достижения необходимого поведения.

Кстати, более полная ссылка на SPL здесь: http://www.php.net/~helly/php/ext/spl/

4 голосов
/ 30 сентября 2010

Вы должны будете уменьшить использование 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());'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...