2012-08-12 117 views
13

我試圖讓scandir();函數超出其書面限制,我需要的不僅僅是它當前支持的alpha排序。我需要對scandir();結果進行排序以按修改日期排序。scandir()按修改日期排序

我已經嘗試了一些解決方案,我在這裏找到了一些其他解決方案,但是沒有一個適合我,所以我認爲這是合理的。

我試過到目前爲止是這樣的:

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

但是,這似乎並沒有工作對我來說,它只有3個結果返回,但它應該返回16分的結果,因爲有16個圖像在文件夾中。

回答

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試試這個方法。單個目錄中的文件名應該是唯一的。因此,它們可以用作關鍵。然後按照值(修改時間)對數組進行排序,並按照正確的順序返回鍵(文件名)。 – 2012-08-12 16:47:45

+0

試過了,像魅力一樣工作。謝謝Ryoin。 – Aborted 2012-08-12 17:46:53

+0

工作就像一個魅力! – BSQ 2014-05-21 12:40:46

0

我想在你的原代碼的問題是多個文件可以有相同的修改日期/時間,因此結合陣列時用相同的修改日期的多個文件條目/時間將被覆蓋,你將只能得到只有一個入口在該時間戳的最後一個數組中。

+0

我明白你的意思。有沒有辦法來解決這個問題? – Aborted 2012-08-12 16:17:40

0

替代例子..

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