Я использую RecursiveDirectoryIterator
и RecursiveIteratorIterator
создавать дерево списка файлов использование кода как ниже. Я должен к списку быть отсортирован - или каталоги затем файлы в алфавитном порядке, или просто в алфавитном порядке.
Кто-либо может сказать мне, как отсортировать список файлов?
$dir_iterator = new RecursiveDirectoryIterator($groupDirectory);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
// do stuff with $file
}
Это невозможно с помощью самого Iterator. Я видел расширение класса Iterator
где-то на SO, которое выполняло сортировку, но смутно помню, что у него были проблемы с этим.
Может быть, ответы на этот вопрос помогут, даже если они указывают в сторону от Итератора?
Обновление : Здесь - обман на ваш вопрос с некоторыми ответами - правда, не много!
Существует множество вариантов, которые вы можете использовать для сортировки итератора тем или иным способом. Выбор лучшего варианта во многом зависит от того, как именно вы хотите манипулировать содержимым итератора, что вы хотите получить из итератора и насколько много или мало итератора вам действительно нужно.
Подходы могут быть разными: использование таких классов, как 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