Использование списка каталогов вида RecursiveDirectoryIterator

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

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

$dir_iterator = new RecursiveDirectoryIterator($groupDirectory);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
    // do stuff with $file
}
13
задан hakre 21 December 2012 в 22:41
поделиться

2 ответа

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

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

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

1
ответ дан 1 December 2019 в 21:37
поделиться

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

Подходы могут быть разными: использование таких классов, как 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
24
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: