répertoire Trier la liste en utilisant RecursiveDirectoryIterator
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
}
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