2012-08-12 50 views
13

Estoy tratando de hacer que la función scandir(); vaya más allá de sus límites escritos, necesito más que la ordenación alfa que admite actualmente. Necesito ordenar los resultados de scandir(); para ser ordenados por fecha de modificación.scandir() para ordenar por fecha de modificación

He intentado algunas soluciones que encontré aquí y algunas otras soluciones de diferentes sitios web, pero ninguno funcionó para mí, por lo que creo que es razonable para mí publicar aquí.

Lo que he probado hasta ahora es la siguiente:

function scan_dir($dir) 
{ 
    $files_array = scandir($dir); 
    $img_array = array(); 
    $img_dsort = array(); 
    $final_array = array(); 

    foreach($files_array as $file) 
    { 
     if(($file != ".") && ($file != "..") && ($file != ".svn") && ($file != ".htaccess")) 
     { 
      $img_array[] = $file; 
      $img_dsort[] = filemtime($dir . '/' . $file); 
     } 
    } 

    $merge_arrays = array_combine($img_dsort, $img_array); 
    krsort($merge_arrays); 

    foreach($merge_arrays as $key => $value) 
    { 
     $final_array[] = $value;  
    } 

    return (is_array($final_array)) ? $final_array : false; 
} 

embargo, esto no parece funcionar para mí, devuelve resultados sólo 3, pero debe devolver 16 resultados, porque hay 16 imágenes en la carpeta.

Respuesta

68
function scan_dir($dir) { 
    $ignored = array('.', '..', '.svn', '.htaccess'); 

    $files = array();  
    foreach (scandir($dir) as $file) { 
     if (in_array($file, $ignored)) continue; 
     $files[$file] = filemtime($dir . '/' . $file); 
    } 

    arsort($files); 
    $files = array_keys($files); 

    return ($files) ? $files : false; 
} 
+0

@dugi probar este método. Los nombres de archivo en un solo directorio deben ser únicos. Por lo tanto, pueden usarse como la clave. La matriz se ordena por valores (el tiempo de modificación) y las claves (los nombres de los archivos) se devuelven en el orden correcto. –

+0

Lo intenté y funcionó a las mil maravillas. Gracias Ryoin. – Aborted

+0

¡Trabaja como un encanto! – BSQ

0

creo que el problema en su código original es varios archivos podrían tener misma modificación de fecha/hora, por tanto, al combinar las matrices de múltiples entradas de archivo con fecha misma modificación/hora se sobrescribirá y que no harán más que una sola entrada en la matriz final para esa marca de tiempo.

+0

Entiendo lo que quieres decir. ¿Hay alguna manera de arreglar esto? – Aborted

0

ejemplo alternativo ..

$dir = "/home/novayear/public_html/backups"; 
chdir($dir); 
array_multisort(array_map('filemtime', ($files = glob("*.{sql,php,7z}", GLOB_BRACE))), SORT_DESC, $files); 
foreach($files as $filename) 
{ 
    echo "<a>".substr($filename, 0, -4)."</a><br>"; 
} 
Cuestiones relacionadas