2012-08-12 10 views
13

Sto cercando di rendere la funzione scandir(); oltre i limiti scritti, ho bisogno di più dell'alpha ordinamento che attualmente supporta. Devo ordinare i risultati scandir(); per essere ordinati per data di modifica.scandir() per ordinare per data modificata

Ho provato alcune soluzioni che ho trovato qui e alcune altre soluzioni da diversi siti Web, ma nessuno ha funzionato per me, quindi penso che sia ragionevole per me pubblicare qui.

Quello che ho provato finora è questo:

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; 
} 

Ma, questo non sembra funzionare per me, esso restituisce solo 3 risultati, ma deve restituire 16 risultati, perché ci sono 16 immagini nella cartella.

risposta

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 provare questo metodo. I nomi dei file in una singola directory dovrebbero essere unici. Pertanto, possono essere utilizzati come chiave. L'array viene quindi ordinato per valori (l'ora di modifica) e le chiavi (i nomi dei file) vengono restituite nell'ordine corretto. –

+0

Provato e ha funzionato come un fascino. Grazie Ryoin. – Aborted

+0

Funziona come un fascino! – BSQ

0

Credo che il problema nel codice originale è più file potrebbero avere stessa modifica data/ora, quindi, quando si combinano gli array voci di file multipli con data stessa modifica/ora verranno sovrascritti e si otterrà solo una sola voce nell'array finale per quel timestamp.

+0

Capisco cosa intendi. C'è un modo per risolvere questo problema? – Aborted

0

esempio 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>"; 
}