Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php scandir()按修改日期排序_Php_Arrays_Sorting_Scandir - Fatal编程技术网

Php scandir()按修改日期排序

Php scandir()按修改日期排序,php,arrays,sorting,scandir,Php,Arrays,Sorting,Scandir,我正在尝试制作scandir()函数超出了它的编写限制,我需要的不仅仅是它当前支持的alpha排序。我需要对scandir()进行排序按修改日期排序的结果 我尝试了一些我在这里找到的解决方案和其他一些来自不同网站的解决方案,但没有一个对我有效,所以我认为我在这里发布是合理的 到目前为止,我尝试的是: function scan_dir($dir) { $files_array = scandir($dir); $img_array = array(); $img_ds

我正在尝试制作
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个图像。

备选示例

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;
}
$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>"; 
}  
$dir=“/home/novayear/public\u html/backups”;
chdir($dir);
数组_multisort(数组_map('filemtime',($files=glob(*.{sql,php,7z}),glob _BRACE))、排序_DESC,$files);
foreach($files作为$filename)
{
echo“.substr($filename,0,-4)。”
; }
这是一个很好的问题,提供了一个可靠的答案,但我需要更大的灵活性来满足我的需要,所以我创建了这个新的函数:
better\u scandir

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

用法是这样的;只需切换到默认值,甚至保留为空:

better_scandir(<filepath goes here>, SCANDIR_SORT_DESCENDING);

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

}
公共函数checkmaxfiles()
{
$dir=应用程序\u路径。“\\modules\\yourmodulename\\public\\backup\\”;
//“../notes/”;
$ignored=数组('.','..','.svn','.htaccess');
$files=array();
foreach(scandir($dir)作为$file){
如果(在数组中($file,$ignored))继续;
$files[$file]=filemtime($dir.'/'.$file);
}
arsort($文件);
$files=数组_键($files);
$length=计数($files);
如果($length<4){
返回;
}
对于($i=$length;$i>4;$i--){
回显“擦除:.$dir.$files[$i];
取消链接($dir.$files[$i]);
}
}

@dugi试试这个方法。单个目录中的文件名应该是唯一的。因此,它们可以用作密钥。然后数组按值(修改时间)排序,键(文件名)按正确顺序返回。效果很好。要忽略所有点文件,您可以使用类似数组的字符串索引,而不是在数组中检查文件名的第一个字符:if($file[0]=')continue;你保存了我的应用。。谢谢你,亲爱的
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]);
    }

}