2010-05-28 3 views
13

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

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

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

Возможный дубликат [после использования $ files = new DirectoryIterator() в PHP, как вы сортируете элементы?] (Http://stackoverflow.com/questions/1076881/after-using-files-new-directoryiterator-in- php-how-do-you-sort-the-items) –

+0

[salathe/spl-examples - Сортировочные итераторы] (https://github.com/salathe/spl-examples/wiki/Sorting-Iterators) – hakre

ответ

1

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

Возможно, ответы на вопросы this question помогают, хотя они указывают на итератор?

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

+0

Dang. Я думал, что эти Итераторы действительно помогут мне. Спасибо Пекке. –

23

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

Подходы могут отличаться; используя классы, такие как 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 
+0

Большое вам спасибо! – eisberg

0

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

+2

При отправке ссылки в качестве ответа, пожалуйста, укажите достаточно содержания, чтобы ответ был полезен сам по себе, в случае, если ссылка ломается позже. –