我在目录中有大量文件,我想搜索具有PHP glob
功能的特定文件。这是我的代码:
/* SAMPLE FILE NAME: PR330037JED10220161204.csv */
$dir = 'Files/Payment/';
$prefix = 'PR';
$vendorNo = '330037';
$region = 'JED';
$date = '20161204';
$files = glob($dir.$prefix.$vendorNo.$region."*".$date.".csv");
它工作正常,但我想检查日期部分是否与日期范围相匹配。如何更改glob表达式?
答案 0 :(得分:2)
循环播放日期范围。尝试以下代码
$dir = 'Files/Payment/';
$prefix = 'PR';
$vendorNo = '330037';
$region = 'JED';
$begin = new DateTime( '2016-12-05' );
$end = new DateTime( '2016-12-10' );
for($i = $begin; $begin <= $end; $i->modify('+1 day')) {
$date = $i->format("Ymd");
$files = glob($dir.$prefix.$vendorNo.$region."*".$date.".csv");
}
答案 1 :(得分:1)
您可以使用glob()支持的GLOB_BRACE
FLAG。
示例:
<?php
$dir = 'Files/Payment/';
$prefix = 'PR';
$vendorNo = '330037';
$region = 'JED';
$date = '20161204';
$d1 = new DateTime();
$d2 = new DateTime('-1 day');
$d3 = new DateTime('-1 week');
// Add your dates here. or even better find a way to generate the below list in an automated way, according to your needs
$daysList = $d1->format('Ymd').','.$d2->format('Ymd').','.$d3->format('Ymd');
$pattern = $dir.$prefix.$vendorNo.$region."*"."{".$daysList."}".".csv";
$files = glob($pattern, GLOB_BRACE);
答案 2 :(得分:1)
glob()
不支持范围。使用glob
可以做的最好的事情是使用GLOB_BRACE
选项列出日期:
$date = '{20161204,20161205,20161206}';
$pattern = sprintf('%s/%s%s%s*%s.csv',
$dir, $prefix, $vendorNo, $region, $date);
$files = glob($pattern, GLOB_BRACE);
更灵活的方法是迭代目录,从文件名解析日期,并检查它是否属于日期间隔:
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
$date_from = 20161204;
$date_to = 20161206;
$pattern = '/^' . preg_quote($prefix . $vendorNo . $region, '/') .
'.*(?P<date>\d{8})\.csv$/';
$it->rewind();
while ($it->valid()) {
if (!$it->isDot()) {
$path = $it->key();
$basename = basename($path);
if (preg_match($pattern, $basename, $matches) &&
isset($matches['date']) &&
$matches['date'] >= $date_from &&
$matches['date'] <= $date_to)
{
echo $basename, PHP_EOL;
}
}
$it->next();
}