Ordinamento degli Iteratori PHP
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.)
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)
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());'));