scandir()按修改日期排序

时间:2012-08-12 15:10:15

标签: php arrays sorting scandir

我试图让scandir();函数超出其书面限制,我需要的不仅仅是它目前支持的alpha排序。我需要对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个图像。

4 个答案:

答案 0 :(得分:80)

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

答案 1 :(得分: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>"; 
}  

答案 2 :(得分:0)

这是一个很好的问题,Ryon Sherman’s answer提供了一个可靠的答案,但是我需要更多的灵活性来满足自己的需求,因此我创建了一个更新的功能:better_scandir

目标是允许scandir排序顺序标志按预期工作;不只是Ryon答案中的反向数组排序方法。并且还要为数组排序显式设置SORT_NUMERIC,因为这些时间值显然是数字。

用法是这样的;只需将SCANDIR_SORT_DESCENDING切换为SCANDIR_SORT_ASCENDING或将其保留为默认值即可:

better_scandir(<filepath goes here>, SCANDIR_SORT_DESCENDING);

这是函数本身:

function better_scandir($dir, $sorting_order = SCANDIR_SORT_ASCENDING) {

  /****************************************************************************/
  // Roll through the scandir values.
  $files = array();
  foreach (scandir($dir, $sorting_order) as $file) {
    if ($file[0] === '.') {
      continue;
    }
    $files[$file] = filemtime($dir . '/' . $file);
  } // foreach

  /****************************************************************************/
  // Sort the files array.
  if ($sorting_order == SCANDIR_SORT_ASCENDING) {
    asort($files, SORT_NUMERIC);
  }
  else {
    arsort($files, SORT_NUMERIC);
  }

  /****************************************************************************/
  // Set the final return value.
  $ret = array_keys($files);

  /****************************************************************************/
  // Return the final value.
  return ($ret) ? $ret : false;

} // better_scandir

答案 3 :(得分:0)

另一个 scandir 保留最新的 5 个文件:

public function checkmaxfiles()
{

    $dir = APPLICATION_PATH . '\\modules\\yourmodulename\\public\\backup\\';
    // '../notes/';
    $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);
    $length = count($files);
    if($length < 4 ){
        return;
    }
    for ($i = $length; $i > 4; $i--) {
           echo "Erase : " .$dir.$files[$i];
           unlink($dir.$files[$i]);
    }

}