Pregunta
¿Existe una forma sencilla de ordenar un iterador en PHP (sin solo jalarlo todo en una matriz y ordenar eso)?
El ejemplo específico que tengo es un DirectoryIterator pero sería bueno tener una solución general para cualquier iterador.
$dir = new DirectoryIterator('.');
foreach ($dir as $file)
echo $file->getFilename();
Me gustaría poder ordenarlos por varios criterios (nombre de archivo, tamaño, etc.)
Solución
No hay manera de hacer eso. Un iterador debe " iterar " a través de la lista. Debe ordenar la lista subyacente para lograr el comportamiento necesario.
Por cierto, la referencia más completa al SPL está aquí: http://www.php.net/~helly/php/ext/spl/
Otros consejos
Para los que terminan aquí 5 años después:
Si convierte el Iterator en una extensión de ArrayIterator, puede utilizar
ArrayIterator :: uasort (para ordenar por valor) y ArrayIterator :: uksort (para ordenar por clave)
Tendrá que reducir el uso de iterator_to_array () y luego uasort (). Y, en mis pruebas de rendimiento, lo suficientemente rápido.
A su ejemplo específico, la forma más compacta que conozco usando los iteradores es a continuación:
// 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());'));