2010-05-28 3 views
13

J'utilise RecursiveDirectoryIterator et RecursiveIteratorIterator pour créer une arborescence de fichiers en utilisant le code ci-dessous. J'ai besoin de la liste à trier - soit des répertoires puis des fichiers par ordre alphabétique, ou simplement par ordre alphabétique. Quelqu'un peut-il me dire comment trier la liste de fichiers?Trier la liste de répertoires à l'aide de RecursiveDirectoryIterator

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

duplication possible de [après avoir utilisé $ files = new DirectoryIterator() en PHP, comment trier les éléments?] (Http://stackoverflow.com/questions/1076881/after-using-files-new-directoryiterator-in- php-how-do-you-sort-the-items) –

+0

[salathe/spl-examples - Tri des itérateurs] (https://github.com/salathe/spl-examples/wiki/Sorting-Iterators) – hakre

Répondre

1

Ceci n'est pas possible avec l'Iterator lui-même. J'ai vu une extension à la classe Iterator quelque part sur SO qui a fait le tri mais souvenez-vous vaguement d'avoir eu des problèmes avec elle.

Peut-être que les réponses à this question aident, même si elles pointent loin de l'Iterator?

Mise à jour: Here est une dupe à votre question avec quelques réponses - certes pas beaucoup, cependant!

+0

Dang. Je pensais que ces itérateurs m'aideraient vraiment. Merci Pekka. –

23

Plusieurs options sont disponibles, que vous pouvez utiliser pour trier un itérateur d'une manière ou d'une autre. La meilleure option dépendra beaucoup de la façon précise dont vous voulez manipuler le contenu de l'itérateur, de ce que vous voulez sortir de l'itérateur et, en fait, de combien ou de peu de l'itérateur vous voulez vraiment avoir.

Les approches peuvent varier; en utilisant des classes comme SplHeap (ou Min, Max variétés), SplPriorityQueue (peut-être pour des choses comme la taille du fichier) ou juste envelopper votre itérateur dans quelque chose comme ArrayObject qui peut trier son propre contenu.

Je vais utiliser un SplHeap comme exemple. Puisque vous voulez organiser par ordre alphabétique le contenu de la RecursiveDirectoryIterator alors quelque chose comme pourrait être utilisé suivant:

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'ordre de tri est alphabétique, le mélange des fichiers et des dossiers:

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

Merci beaucoup! – eisberg

0

Sönke Ruempler a une grande solution:

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

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

+2

Lorsque vous postez un lien en guise de réponse, veuillez inclure suffisamment de contenu pour que la réponse soit utile par elle-même, au cas où le lien se brise plus tard. –

Questions connexes