如果我有一个目录,其中文件列表如下所示:
Something_2015020820.txt
something_5294032944.txt.a
something_2015324234.txt
Something_2014435353.txt.a
我希望得到文件列表按最早的日期排序(不是文件名),结果应该采取与something_xxxxxxx.txt匹配的任何内容。因此,任何以“.a”结尾的内容都不包括在内。在这种情况下,它应该返回
Something_2015020820.txt
something_2015324234.txt
我做一些谷歌搜索,似乎我可以使用glob
$listOfFiles = glob($this->directory . DIRECTORY_SEPARATOR . $this->pattern . "*");
但我不确定这种模式。
如果你能同时提供区分大小写和不敏感的模式,那就太棒了。匹配模式必须是something_number.txt
答案 0 :(得分:2)
使用glob有点棘手。它确实支持一些有限的模式匹配。例如,您可以
glob("*.[tT][xX][tT]");
这将匹配file.txt
和file.TXT
,但它也会匹配file.tXt
和file.TXt
。遗憾的是,无法指定file.(txt or TXT)
之类的内容。如果这不是问题,太棒了!否则,您必须首先使用此方法至少缩小结果范围,然后再执行一些额外的处理。 array_filter和一些正则表达式可能。
更好的选择可能是使用PHP的Iterator类,因此您可以指定更高级的规则。
$directoryIterator = new RecursiveDirectoryIterator($directory);
$iteratorIterator = new RecursiveIteratorIterator($directoryIterator);
$fileList = new RegexIterator($iteratorIterator, '/^.*\.(txt|TXT)$/');
foreach($fileList as $file) {
echo $file;
}
答案 1 :(得分:1)
您可以使用scandir
获取所有文件。然后preg_match
将这些文件过滤为不以.a
结尾的文件。然后filemtime
可用于拉取文件上次修改的时间。然后可以使用array_multisort
在文件上次修改时进行排序,并保持密钥/文件名关联。
这符合我的预期:
date_default_timezone_set('America/New_York'); //change to your timezone
$directory = 'Your Directory';
$files = scandir($directory);
foreach($files as $file) {
if(!preg_match('~\.a$~', $file) && !is_dir($directory . $file)) {
$time["$file"] = filemtime($upload_directory . $file);
}
}
array_multisort($time);
然后,为了处理输出,您可以执行以下操作:
foreach($time as $file => $da_time){
echo $file . ' '. date('m/d/Y H:i:s', $da_time) . "\n";
}
preg_match
可以在i
分隔符后添加~
,因此正则表达式不区分大小写;或者您可以将a
更改为[aA]
。