2016-12-10 4 views
1

У меня есть большое количество файлов в каталоге, и я хочу искать определенные файлы с помощью функции PHP glob. Это мой код:Можно ли передать диапазон значений функции glob в PHP?

/* 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?

ответ

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

Вы можете использовать GLOB_BRACE FLAG, что glob() поддерживает.

Пример:

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

 Смежные вопросы

  • Нет связанных вопросов^_^