scandir()按修改日期排序

Dug*_*ugi 21 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎对我不起作用,它只返回3个结果,但它应该返回16个结果,因为文件夹中有16个图像.

Ryo*_*man 87

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 效果很好。要忽略所有点文件,您可以使用类似数组的字符串索引而不是 in_array 来检查文件名的第一个字符: if ($file[0] === '.') continue; (2认同)

Jak*_*uld 8

这是一个很好的问题,Ryon Sherman\xe2\x80\x99s 的答案提供了可靠的答案,但我需要更多的灵活性来满足我的需求,所以我创建了这个新函数:better_scandir

\n

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

\n

用法是这样的;只需切换SCANDIR_SORT_DESCENDINGSCANDIR_SORT_ASCENDING默认值或什至将其留空:

\n
better_scandir(<filepath goes here>, SCANDIR_SORT_DESCENDING);\n
Run Code Online (Sandbox Code Playgroud)\n

这是函数本身:

\n
function better_scandir($dir, $sorting_order = SCANDIR_SORT_ASCENDING) {\n\n  /****************************************************************************/\n  // Roll through the scandir values.\n  $files = array();\n  foreach (scandir($dir, $sorting_order) as $file) {\n    if ($file[0] === \'.\') {\n      continue;\n    }\n    $files[$file] = filemtime($dir . \'/\' . $file);\n  } // foreach\n\n  /****************************************************************************/\n  // Sort the files array.\n  if ($sorting_order == SCANDIR_SORT_ASCENDING) {\n    asort($files, SORT_NUMERIC);\n  }\n  else {\n    arsort($files, SORT_NUMERIC);\n  }\n\n  /****************************************************************************/\n  // Set the final return value.\n  $ret = array_keys($files);\n\n  /****************************************************************************/\n  // Return the final value.\n  return $ret;\n\n} // better_scandir\n
Run Code Online (Sandbox Code Playgroud)\n