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.)

¿Fue útil?

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)

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

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

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());'));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top