directory Ordina messa usando RecursiveDirectoryIterator
Domanda
Sto usando RecursiveDirectoryIterator
e RecursiveIteratorIterator
di costruire un elenco di file dell'albero utilizzando il codice come qui di seguito. Ho bisogno di lista da ordinare -. Sia le directory allora i file in ordine alfabetico, o semplicemente in ordine alfabetico
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
}
Soluzione
Questo non è possibile utilizzare l'Iterator stesso. Ho visto una proroga per il posto di classe Iterator
sul SO che ha l'ordinamento, ma ricordo vagamente di aver avuto problemi con esso.
Forse le risposte a questa domanda aiuto, anche anche se in direzione opposta al Iterator?
Aggiorna : Ecco è una vittima alla tua domanda con alcune risposte - certamente non molti, anche se
Altri suggerimenti
Ci sono diverse opzioni disponibili, che è possibile utilizzare per ordinare un iteratore in un modo o nell'altro. L'opzione migliore sarebbe dipenderà molto proprio su come si desidera manipolare il contenuto iteratore, ciò che si vuole uscire dalla iteratore e in effetti quanto o poco del iteratore si vuole veramente / bisogno.
Approcci varierebbe; facendo uso di classi come SplHeap
(o Min
, varietà Max
), SplPriorityQueue
(forse per le cose come le dimensioni del file) o semplicemente avvolgendo l'iteratore in qualcosa di simile 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, mescolando file e cartelle:
./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 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