2011-10-04 23 views
15

Estoy usando la clase DirectoryIterator de php para listar archivos en un directorio. No obstante, no puedo encontrar una manera fácil de ordenar los archivos por fecha. ¿Cómo se hace esto con DirectoryIteratorphp DirectoryIterator Ordene los archivos por fecha

<?php 
$dir = new DirectoryIterator('.'); 
    foreach ($dir as $fileinfo) {  
    echo $fileinfo->getFilename() . '<br>'; 
    } 
?> 

¿Qué pasa si nombrar mis archivos como whatever_2342345345.ext donde los números representan el tiempo en milisegundos para que cada archivo tiene un número único. ¿Cómo podemos clasificar mirando los números después del guión bajo

Respuesta

20

Si necesita ordenar, compilar una matriz y ordenarla.

$files = array(); 
$dir = new DirectoryIterator('.'); 
foreach ($dir as $fileinfo) {  
    $files[$fileinfo->getMTime()][] = $fileinfo->getFilename(); 
} 

ksort($files); 

Esto creará una matriz con la hora de modificación como la clave y una serie de nombres de archivo como el valor. Luego ordena a través de ksort(), que le dará los nombres de archivo en orden de tiempo modificado.

Si a continuación desea volver a aplanar la estructura a una matriz estándar, puede utilizar ...

$files = call_user_func_array('array_merge', $files); 
+10

Debo decir que está un poco equivocado al decir "Existe un iterador para hacer justamente eso, iterar". Los iteradores, por su naturaleza, podrían agregar características de filtraje y ordenamiento. De hecho, el objetivo del iterador es proporcionar una interfaz para iterar, pero esta definición no restringe al iterador para realizar algunos trabajos internos con los datos. – zerkms

+0

El ejemplo que proporcionó no funciona para mí. Lo intentaste. ¿Qué pasa si nombro mis archivos como whatever_2342345345.ext donde los números representan el tiempo donde cada archivo tiene un número único? ¿Cómo podemos clasificar mirando los números después del guión bajo – Pinkie

+0

@Pinkie: No lo intenté, pero la teoría debería ser correcta. ¿Qué error obtuvo? ¿Estás buscando '$ files'? – alex

1

En caso de múltiples archivos tienen la misma hora de modificación (actualizado):

$files = array(); 
$mtimes = array(); 
$dir = new DirectoryIterator('.'); 
foreach($dir as $file){ 
    if(!$file->isFile()) 
    continue; 

    $mtime = $file->getMTime(); 

    if(!$mtimes[$mtime]){ 
    $files[$mtime.'.0'] = $file->getFilename(); 
    $mtimes[$mtime] = 1; 
    }else{ 
    $files[$mtime.'.'.$mtimes[$mtime]++] = $file->getFilename(); 
    } 
} 

ksort($files); 
1

Si aún desea acceder a todos los datos disponibles en DirectoryIterator (por ej. isDot()getSize() etc.), una forma posible es almacenar la tecla Iterator en la matriz que va a ordenar y buscar DirectoryIterator más adelante.

$sorted_keys = array(); 
$dir_iterator = new DirectoryIterator('.'); 

foreach ($dir_iterator as $fileinfo) 
{ 
    $sorted_keys[$fileinfo->getMTime()] = $fileinfo->key(); 
} 

ksort($sorted_keys); 

/* Iterate `DirectoryIterator` as a sorted array */ 
foreach ($sorted_keys as $key) 
{ 
    $dir_iterator->seek($key); 
    $fileinfo = $dir_iterator->current(); 

    /* Use $fileinfo here as a normal DirectoryIterator */ 
    echo $fileinfo->getFilename() . ' ' . $fileinfo->getSize() . '<br>'; 
} 
Cuestiones relacionadas