php DirectoryIterator按日期排序文件

问题描述:

我使用php的DirectoryIterator类来列出目录中的文件。然而,我不能想出一个按日期排序文件的简单方法。这是如何与DirectoryIteratorphp DirectoryIterator按日期排序文件

<?php 
$dir = new DirectoryIterator('.'); 
    foreach ($dir as $fileinfo) {  
    echo $fileinfo->getFilename() . '<br>'; 
    } 
?> 

如果我的名字我的文件,如whatever_2342345345.ext其中数字表示毫秒时间,所以每个文件都有一个唯一的编号来完成。我们如何通过查看下划线后的数字来排序

如果您需要排序,请构建一个数组并对其进行排序。

$files = array(); 
$dir = new DirectoryIterator('.'); 
foreach ($dir as $fileinfo) {  
    $files[$fileinfo->getMTime()][] = $fileinfo->getFilename(); 
} 

ksort($files); 

这将构建一个数组,其修改时间作为键和一个文件名数组作为值。然后它通过ksort()进行排序,它会按照修改时间的顺序为您提供文件名。

然后,如果您想将结构重新拼合到一个标准的阵列,可以使用...

$files = call_user_func_array('array_merge', $files); 
+10

我不得不说,你说错了“一个迭代器存在这样做,迭代。”。迭代器本质上可以增加筛选和排序功能。事实上,迭代器的目标是提供迭代接口,但是这个定义并不限制迭代器对数据做一些内部工作。 – zerkms

+0

你提供的例子不适合我。你试过了吗?如果我将我的文件命名为whatever_2342345345.ext,其中数字表示每个文件具有唯一编号的时间。我们如何通过查看下面的数字来排序 – Pinkie

+0

@Pinkie:我没有尝试,但理论应该是正确的。你得到了什么错误?你在看''文件'? – alex

如果多个文件具有相同的修改的时间(更新):

$files = array(); 
$mtimes = array(); 
$dir = new DirectoryIterator('.'); 
foreach($dir as $file){ 
    if(!$file->isFile()) 
    continue; 

    $mtime = $file->getMTime(); 

    if(!$mtimes[$mtime]){ 
    $files[$mtime.'.0'] = $file->getFilename(); 
    $mtimes[$mtime] = 1; 
    }else{ 
    $files[$mtime.'.'.$mtimes[$mtime]++] = $file->getFilename(); 
    } 
} 

ksort($files); 

如果您仍想访问DirectoryIterator(例如isDot()getSize()等)的所有可用数据,可能的方法是将迭代器键存储在要排序的阵列上,并在稍后查找DirectoryIterator

$sorted_keys = array(); 
$dir_iterator = new DirectoryIterator('.'); 

foreach ($dir_iterator as $fileinfo) 
{ 
    $sorted_keys[$fileinfo->getMTime()] = $fileinfo->key(); 
} 

ksort($sorted_keys); 

/* Iterate `DirectoryIterator` as a sorted array */ 
foreach ($sorted_keys as $key) 
{ 
    $dir_iterator->seek($key); 
    $fileinfo = $dir_iterator->current(); 

    /* Use $fileinfo here as a normal DirectoryIterator */ 
    echo $fileinfo->getFilename() . ' ' . $fileinfo->getSize() . '<br>'; 
}