Domanda

Esiste un modo semplice per ordinare un iteratore in PHP (senza semplicemente trascinarlo tutto in un array e ordinarlo).

L'esempio specifico che ho è un DirectoryIterator ma sarebbe bello avere una soluzione generale per qualsiasi iteratore.

$dir = new DirectoryIterator('.');
foreach ($dir as $file)
    echo $file->getFilename();

Vorrei poterli ordinare in base a vari criteri (nome file, dimensione, ecc.)

È stato utile?

Soluzione

Non c'è modo di farlo. Un iteratore dovrebbe " iterare " attraverso l'elenco. Devi ordinare l'elenco sottostante per ottenere il comportamento necessario.

A proposito, il riferimento più completo a SPL è qui: http://www.php.net/~helly/php/ext/spl/

Altri suggerimenti

Per quelli che finiscono qui 5 anni dopo:

Se rendi Iterator un'estensione di ArrayIterator puoi usare

ArrayIterator :: uasort (per ordinare in base al valore) e ArrayIterator :: uksort (per ordinare in base alla chiave)

http://php.net/manual/en/arrayiterator.uasort.php

http://php.net/manual/en/arrayiterator.uksort.php

Dovrai ridurre utilizzando iterator_to_array () quindi uasort (). E, nei miei test delle prestazioni, sufficientemente veloce.

Nel tuo esempio specifico, il modo più compatto che conosco utilizzando gli iteratori è di seguito:

// get (recursively) files matching a pattern, each file as SplFileInfo object
$matches = new RegexIterator(
               new RecursiveIteratorIterator(
                   new RecursiveDirectoryIterator('/path/to/files/')
               ),
               '/(\.php|\.ini|\.xml)$/i'
            );
 $files = iterator_to_array($matches);

// sort them by name
uasort($files, create_function('$a,$b', 'return strnatcasecmp($a->getFilename(), $b->getFilename());'));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top