Сортировать список справочников с использованием Recursivedirectoryiteraterator

StackOverflow https://stackoverflow.com/questions/2930405

  •  05-10-2019
  •  | 
  •  

Вопрос

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

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

$dir_iterator = new RecursiveDirectoryIterator($groupDirectory);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
    // do stuff with $file
}
Это было полезно?

Решение

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

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

Обновлять: Здесь Является ли дубус на ваш вопрос с некоторыми ответами - по общему признанию не много, хотя!

Другие советы

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

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

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-sortingierator

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top