是否可以将一系列值传递给 PHP 中的 glob 函数?
Is it possible to pass a range of values to the glob function in PHP?
我在一个目录中有大量文件,我想使用 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 表达式?
遍历日期范围。试试下面的代码
$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");
}
您可以使用 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);
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();
}
我在一个目录中有大量文件,我想使用 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 表达式?
遍历日期范围。试试下面的代码
$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");
}
您可以使用 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);
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();
}