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);
答
如果多个文件具有相同的修改的时间(更新):
$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>';
}
我不得不说,你说错了“一个迭代器存在这样做,迭代。”。迭代器本质上可以增加筛选和排序功能。事实上,迭代器的目标是提供迭代接口,但是这个定义并不限制迭代器对数据做一些内部工作。 – zerkms
你提供的例子不适合我。你试过了吗?如果我将我的文件命名为whatever_2342345345.ext,其中数字表示每个文件具有唯一编号的时间。我们如何通过查看下面的数字来排序 – Pinkie
@Pinkie:我没有尝试,但理论应该是正确的。你得到了什么错误?你在看''文件'? – alex