2012-08-12 16 views
13

Próbuję uczynić funkcję scandir(); wykraczającą poza jej zapisane ograniczenia, potrzebuję czegoś więcej niż sortowanie alfa, które obecnie obsługuje. Muszę posortować wyniki scandir();, aby posortować je według daty modyfikacji.scandir() do sortowania według daty modyfikacji

Wypróbowałem kilka rozwiązań, które znalazłem tutaj, oraz kilka innych rozwiązań z różnych stron internetowych, ale żaden z nich nie działał dla mnie, więc myślę, że to rozsądne, że mogę publikować tutaj.

Co próbowałem tak daleko jest taka:

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

Ale to nie wydają się działać dla mnie, to zwraca tylko 3 wyniki, ale powinien wrócić 16 wyników, ponieważ istnieje 16 obrazy w folderze.

Odpowiedz

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 spróbować tej metody. Nazwy plików w jednym katalogu powinny być unikalne. Dlatego mogą być używane jako klucz. Tablica jest następnie sortowana według wartości (czasu modyfikacji), a klucze (nazwy plików) zwracane są we właściwej kolejności. –

+0

Wypróbowałem to i zadziałało jak czar. Dzięki, Ryoin. – Aborted

+0

Działaj jak czar! – BSQ

0

Myślę, że problem w swoim oryginalnym kodzie jest wiele plików może mieć tę samą odmianę datę/czas, stąd podczas łączenia tablic wiele wpisów plików z datą samo modyfikacji/czas dostanie nadpisane, a dostaniesz tylko tylko jeden wpis w końcowej tablicy dla tego znacznika czasu.

+0

Rozumiem, co masz na myśli. Czy istnieje sposób, aby to naprawić? – Aborted

0

Alternatywny przykład ..

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