2012-08-12 352 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>"; 
}