是否可以将一系列值传递给PHP中的glob函数?

时间:2016-12-10 08:02:09

标签: php function file search glob

我在目录中有大量文件,我想搜索具有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表达式?

3 个答案:

答案 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();
}