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
}
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top