Intereting Posts
Два сайта WordPress, использующие разные темы в одной базе данных Создание файлов сообщений перевода Yii Как отобразить текущую версию рабочей копии hg-репозитория на странице PHP PHP: Какой самый быстрый и простой способ получить последний элемент массива? Получить идентификатор соединения PDO Невозможно выполнить поиск запросов в таблице MySQL Функция PHP для удаления всех между определенным символом (-ами) в строке Класс DateTime, как иметь дело с отрицательным интервалом даты Использование квадратных скобок в скрытых вводных полях HTML как я могу изменить весь шаблон страницы в соответствии с модулем в drupal6 Получение валютного символа из кода валюты RackSpace Cloud Strips $ _SESSION, если у URL есть определенные расширения файлов Предотвратить установку даты PHP () от дефолта до 12/31/1969 Не могу заставить Guzzle работать в моем приложении Laravel на Bluemix Как использовать XMLReader / DOMDocument с большим XML-файлом и предотвратить ошибку 500

Сортировка списка каталогов с помощью RecursiveDirectoryIterator

Я использую RecursiveDirectoryIterator и RecursiveIteratorIterator для создания дерева списка файлов, используя код, как показано ниже. Мне нужно отсортировать список – либо каталоги, либо файлы в алфавитном порядке, либо просто в алфавитном порядке.

Может ли кто-нибудь сказать мне, как сортировать список файлов?

 $dir_iterator = new RecursiveDirectoryIterator($groupDirectory); $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $file) { // do stuff with $file } 

Это невозможно с использованием самого Итератора. Я видел расширение класса Iterator где-то на SO, которое делало сортировку, но смутно напоминало, что у него были проблемы с ним.

Может быть, ответы на этот вопрос помогут, хотя они указывают на Итератор?

Обновление : вот ваш вопрос с некоторыми ответами – правда, не так много!

Доступно несколько опций, которые вы можете использовать для сортировки итератора так или иначе. Лучший вариант будет очень зависеть от того, как вы хотите манипулировать содержимым итератора, что вы хотите выбраться из итератора, и действительно, сколько или мало итератора вы действительно хотите / нуждаетесь.

Подходы будут варьироваться; используя классы, такие как SplHeap (или Min , Max varieties), 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 

Sönke Ruempler имеет отличное решение:

 class SortingIterator implements IteratorAggregate { private $iterator = null; public function __construct(Traversable $iterator, $callback) { if (!is_callable($callback)) { throw new InvalidArgumentException('Given callback is not callable!'); } $array = iterator_to_array($iterator); usort($array, $callback); $this->iterator = new ArrayIterator($array); } public function getIterator() { return $this->iterator; } } 

Источник: http://www.ruempler.eu/2008/08/09/php-sortingiterator