scandir() 按修改日期排序

scandir() to sort by date modified

提问人:aborted 提问时间:8/12/2012 最后编辑:halferaborted 更新时间:5/11/2023 访问量:81804

问:

我试图使函数超出其书面限制,我需要的不仅仅是它目前支持的 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 张图像。

PHP 数组 排序 scandir

评论


答:

120赞 Ryon Sherman 8/12/2012 #1
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;
}

评论

0赞 Ryon Sherman 8/13/2012
@dugi试试这个方法。单个目录中的文件名应该是唯一的。因此,它们可以用作密钥。然后按值(修改时间)对数组进行排序,并按正确的顺序返回键(文件名)。
4赞 Richard 7/3/2015
效果很好。要忽略所有点文件,您可以使用类似数组的字符串索引而不是 in_array 来检查文件名的第一个字符:if ($file[0] === '.') continue;
1赞 Ramesh_D 6/2/2018
你保存了我的应用程序。谢谢你,亲爱的
1赞 NovaYear 12/20/2013 #2

替代示例..

$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>"; 
}  
8赞 Giacomo1968 5/24/2019 #3

这是一个很好的问题,Ryon Sherman 的回答提供了一个可靠的答案,但我需要更多的灵活性来满足我的需求,所以我创建了这个更新的功能:.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;

} // better_scandir
0赞 Letech 5/20/2021 #4

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

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

}