2016-12-10 2 views
1

Ich habe eine große Anzahl von Dateien in einem Verzeichnis und ich möchte nach bestimmten Dateien mit PHP glob Funktion suchen. Dies ist mein Code:Ist es möglich, einen Wertebereich an die glob-Funktion in PHP zu übergeben?

/* SAMPLE FILE NAME: PR330037JED10220161204.csv */ 
$dir  = 'Files/Payment/'; 
$prefix  = 'PR'; 
$vendorNo = '330037'; 
$region  = 'JED'; 
$date  = '20161204'; 
$files  = glob($dir.$prefix.$vendorNo.$region."*".$date.".csv"); 

Es funktioniert gut, aber ich würde gerne überprüfen, ob das Datum Teil eines Datumsbereich übereinstimmt. Wie ändere ich den Glob-Ausdruck?

Antwort

2

Schleife durch den Zeitraum. versuchen folgenden Code

$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

Sie können den GLOB_BRACE Flag, das glob() Stützen machen.

Beispiel:

<?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() nicht Bereiche unterstützen. Das Beste, was Sie mit glob tun können, ist die Daten aufzulisten GLOB_BRACE Option:

$date = '{20161204,20161205,20161206}'; 
$pattern = sprintf('%s/%s%s%s*%s.csv', 
    $dir, $prefix, $vendorNo, $region, $date); 

$files = glob($pattern, GLOB_BRACE); 

Eine flexiblere Art und Weise ist das Verzeichnis zu wiederholen, das Datum aus dem Dateinamen analysieren und überprüfen, ob es zu einem Intervall von Terminen gehört :

$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(); 
} 
Verwandte Themen