2008-09-24 23 views
42

Estoy tratando de mostrar una matriz de archivos por orden de fecha (última modificación).glob() - ordenar por fecha

He hecho esto comprando en bucle a través de la matriz y ordenándola en otra matriz, pero ¿hay una forma más fácil (más eficiente) de hacerlo?

+1

¿Le pareció esto? (Acabo de hacer una búsqueda en Google en el título de su pregunta): http://www.webdeveloper.com/forum/showthread.php?t=188670 – John

Respuesta

83

Por el bien de la posteridad, en caso de que se pierde el mensaje del foro vinculado en la respuesta aceptada o poco claro para algunos, el código relevante necesaria es:

<?php 

$myarray = glob("*.*"); 
usort($myarray, create_function('$a,$b', 'return filemtime($a) - filemtime($b);')); 

?> 

probado esto en mi sistema y verifica que hace una especie por archivo mtime como se desee. Utilicé un enfoque similar (escrito en Python) para determinar también los últimos archivos actualizados en mi sitio web.

+10

Funcionó maravillosamente. Quería el orden inverso, así que cambié $ a con $ b en el campo de definición de función. Gracias Jay! – AVProgrammer

+3

Acabo de usar esto de nuevo. Para la posteridad de hecho! – AVProgrammer

+3

Este código está accediendo al sistema de archivos cada vez que se realiza una comparación (varias veces para cada archivo). Dependiendo de dónde esté tu sistema de archivos, eso podría ser muy lento. Además, si se escribe alguno de los archivos durante la ordenación, el cambio de los tiempos de archivo podría generar resultados de clasificación extraños, según el algoritmo utilizado por el usort. Recomendaría la [otra respuesta] (http://stackoverflow.com/a/3298787/706054), que evita todos estos problemas. – Matt

32
<?php 
$items = glob('*', GLOB_NOSORT); 
array_multisort(array_map('filemtime', $items), SORT_NUMERIC, SORT_DESC, $items); 
+0

No tiene sentido pasar el resultado de 'array_map' como un argumento destinado a pasar por referencia. Lo ordenarás, pero ¿qué? Ya no lo tienes. – Okonomiyaki3000

+1

El resultado de 'array_map' se utiliza para ordenar la matriz' $ items', que también se pasa por referencia. –

+1

Ya veo. Supongo que esto funcionará, incluso se documenta un enfoque similar en la página 'array_multisort' de php.net. Creo que hay funciones más apropiadas para esta tarea, pero recuperaré mi voto negativo. O lo haría si pudiera ... lo siento. – Okonomiyaki3000

7

Esta solución es la misma que accepted answer, actualizada con función anónima :

$myarray = glob("*.*"); 

usort($myarray, function($a, $b) { return filemtime($a) - filemtime($b); }); 

Anonymous functions se han introducido en PHP en 2010. Respuesta original está fechada en 2008.