2010-05-28 6 views
13

Sto utilizzando RecursiveDirectoryIterator e RecursiveIteratorIterator per creare un albero con un elenco di file utilizzando il codice come di seguito. Ho bisogno dell'elenco per essere ordinato: directory o file alfabeticamente o semplicemente alfabeticamente.Ordinamento dell'elenco di directory utilizzando RecursiveDirectoryIterator

Qualcuno può dirmi come ordinare l'elenco dei file?

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

possibile duplicato di [dopo aver usato $ files = new DirectoryIterator() in PHP, come si ordinano gli articoli?] (Http://stackoverflow.com/questions/1076881/after-using-files-new-directoryiterator-in- php-how-do-you-sort-the-items) –

+0

[salathe/spl-examples - Sorting Iterators] (https://github.com/salathe/spl-examples/wiki/Sorting-Iterators) – hakre

risposta

1

Questo non è possibile utilizzando lo stesso Iterator. Ho visto un'estensione della classe Iterator da qualche parte su SO che ha fatto l'ordinamento, ma ricordo con certezza di aver avuto problemi con esso.

Forse le risposte all'aiuto this question, anche se puntano lontano da Iterator?

Aggiornamento: Here è un problema alla tua domanda con alcune risposte - certamente non molte, però!

+0

Dang. Pensavo che questi Iterators mi avrebbero davvero aiutato. Grazie a Pekka. –

23

Sono disponibili più opzioni, che è possibile utilizzare per ordinare un iteratore in un modo o nell'altro. L'opzione migliore dipenderà molto dal modo preciso in cui si desidera manipolare i contenuti degli iteratori, da cosa si vuole uscire dall'iteratore e in effetti dalla quantità o poco dell'iteratore che si desidera realmente/necessario.

Gli approcci varierebbero; facendo uso di classi come SplHeap (o Min, Max), SplPriorityQueue (forse per cose come le dimensioni del file) o semplicemente avvolgendo il tuo iteratore in qualcosa come ArrayObject che può ordinare i propri contenuti.

Userò un SplHeap come esempio. Dal momento che si desidera organizzare l'intero contenuto del RecursiveDirectoryIterator alfabetico poi qualcosa di simile al seguente potrebbe essere utilizzato:

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

L'ordinamento è alfabetico, i file e le cartelle di miscelazione:

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

Grazie mille! – eisberg

0

Sönke Ruempler ha una grande soluzione:

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

Fonte: http://www.ruempler.eu/2008/08/09/php-sortingiterator

+2

Quando si pubblica un collegamento come risposta, si prega di includere abbastanza contenuti che la risposta sia utile da sola, nel caso in cui il collegamento si interrompa in un secondo momento. –

Problemi correlati