2008-10-30 22 views
11

¿Hay una forma simple de ordenar un iterador en PHP (sin simplemente poner todo en una matriz y ordenar eso).Ordenando Iteradores de PHP

El ejemplo específico que tengo es 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 ser capaz de ordenar éstos por diversos criterios (nombre de archivo, tamaño, etc.)

Respuesta

4

No hay manera de hacerlo. Un iterador debe "iterar" a través de la lista. Tienes que ordenar la lista subyacente para lograr el comportamiento necesario.

Por cierto, la referencia más completa a la SPL está aquí: http://www.php.net/~helly/php/ext/spl/

+0

Eso es lo que me temía – Greg

3

Vas a tener que reducir el uso de iterator_to_array() entonces uasort(). Y, en mi prueba de rendimiento, lo suficientemente rápido.

Para el ejemplo específico, la forma más compacta que conozco utilizando 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());'));