Question

J'utilise RecursiveDirectoryIterator et RecursiveIteratorIterator pour créer un fichier en utilisant le code arbre liste comme ci-dessous. Je dois la liste à trier -. Soit répertoires fichiers puis par ordre alphabétique, ou tout simplement par ordre alphabétique

Quelqu'un peut-il me dire comment trier la liste des fichiers?

$dir_iterator = new RecursiveDirectoryIterator($groupDirectory);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
    // do stuff with $file
}
Était-ce utile?

La solution

Ceci est impossible avec l'itérateur lui-même. Je l'ai vu une extension de la part de la classe Iterator sur SO qui ne le tri mais souvenez-vous d'avoir eu vaguement mal avec elle.

Peut-être les réponses à l'aide de cette question, même mais ils pointent loin de la Iterator?

Mise à jour : Voici dupé à votre question avec des réponses - certes pas beaucoup, mais

Autres conseils

Il y a plusieurs options disponibles, que vous pouvez utiliser pour trier un itérateur d'une manière ou d'une autre. La meilleure option dépend beaucoup précisément sur la façon dont vous voulez manipuler le contenu de iterator, ce que vous voulez sortir de la iterator et même combien ou peu de iterator vous voulez vraiment / besoin.

Approches varierait; en utilisant des classes comme SplHeap (ou Min, variétés Max), SplPriorityQueue (peut-être pour des choses comme la taille du fichier) ou simplement envelopper votre iterator 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

Sönke Ruempler a une excellente 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top