2010-05-28 17 views
13

Używam RecursiveDirectoryIterator i RecursiveIteratorIterator do budowania drzewa listy plików przy użyciu kodu podobnego do poniższego. Potrzebuję do sortowania listy - albo katalogi są sortowane alfabetycznie, albo alfabetycznie.Sortowanie wykazu katalogów przy użyciu narzędzia RecursiveDirectoryIterator

Czy ktoś może mi powiedzieć, jak posortować listę plików?

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

możliwy duplikat [po użyciu $ files = new DirectoryIterator() w PHP, jak sortujesz elementy?] (Http://stackoverflow.com/questions/1076881/after-using-files-new-directoryiterator-in- php-how-do-you-sort-the-items) –

+0

[salathe/spl-przykłady - Sortowanie Iteratory] (https://github.com/salathe/spl-examples/wiki/Sorting-Iterators) – hakre

Odpowiedz

1

Nie jest to możliwe przy użyciu samego iteratora. Widziałem rozszerzenie do klasy Iterator gdzieś na SO, które sortowanie, ale pamiętaj, aby mieć kłopoty z nim.

Może odpowiedzi na this question są pomocne, mimo że wskazują na Iterator?

Aktualizacja : Here to podróbka Twojego pytania z kilkoma odpowiedziami - wprawdzie niezbyt wiele!

+0

Dang. Myślałem, że te Iteratory naprawdę mi pomogą. Dzięki, Pekka. –

23

Dostępne są różne opcje, których można użyć do sortowania iteratora w taki czy inny sposób. Najlepsza opcja będzie zależeć od tego, w jaki sposób chcesz manipulować zawartością iteratora, co chcesz wydostać z iteratora i ile iteratora naprawdę potrzebujesz/potrzebujesz.

Podejścia różnią się; korzystając z klas takich jak SplHeap (lub Min, Max odmian),(może na takie rzeczy jak rozmiar pliku) lub po prostu owijając swój iterator w coś takiego jak ArrayObject, który może sortować własną zawartość.

Jako przykład podam przykład SplHeap. Ponieważ chcesz zorganizować całą zawartość RecursiveDirectoryIterator alfabetycznie następnie coś jak poniżej mogą być wykorzystane:

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; 
} 

Kolejność sortowania jest alfabetyczna, mieszanie pliki i foldery:

./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

Dziękuję bardzo! – eisberg

0

Sönke Ruempler ma wielkie rozwiązanie:

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; 
     } 
} 

Źródło: http://www.ruempler.eu/2008/08/09/php-sortingiterator

+2

Wysyłając link jako odpowiedź, dołącz wystarczającą ilość treści, aby odpowiedź była przydatna sama, na wypadek gdyby link się zepsuł później. –

Powiązane problemy