Vende Achat
Vende Achat

Reputation: 183

Shell command get all files between two dates in PHP?

I have a directory with files like this:

/home/fichier/2017-10-01_Opens.tsv
/home/fichier/2017-10-02_Opens.tsv
/home/fichier/2017-10-03_Opens.tsv
/home/fichier/2017-10-05_Opens.tsv
/home/fichier/2017-10-06_Opens.tsv
/home/fichier/2017-10-07_Opens.tsv

I'm using PHP like this to get all dates, where $range is an array of dates:

for($k=0;$k<sizeof($range);$k++)
{ 
 $path = '/home/fichier/'.$kk[$j]."_Opens".tsv";    
}

The result when dates bewteen 2017-10-03 and 2017-10-06 are chosen is:

/home/fichier/2017-10-03_Opens.tsv
/home/fichier/2017-10-05_Opens.tsv
/home/fichier/2017-10-06_Opens.tsv

The loop is taking a very long time when I have big date range (for example, more than 6 months). Is there any solution to get all files with one command and save these in an array without using a loop?

Thank you!

Upvotes: 0

Views: 106

Answers (2)

Younes Zaidi
Younes Zaidi

Reputation: 1190

Edit use shell_exec this you file:

/home/fichier/2017-10-01_Opens.tsv
/home/fichier/2017-10-02_Opens.tsv
/home/fichier/2017-10-03_Opens.tsv
/home/fichier/2017-10-05_Opens.tsv
/home/fichier/2017-10-06_Opens.tsv
/home/fichier/2017-10-07_Opens.tsv

use like this :

 $files = shell_exec("ls -d /home/fichier/*0[3-6]_Opens.tsv");

Output:

/home/fichier/2017-10-03_Opens.tsv
/home/fichier/2017-10-05_Opens.tsv
/home/fichier/2017-10-06_Opens.tsv

Upvotes: 1

Akshay Hegde
Akshay Hegde

Reputation: 16997

You can use array_filter()

Here is demo

<?php

$range = array(
'/home/fichier/2017-10-01_Opens.tsv',
'/home/fichier/2017-10-02_Opens.tsv',
'/home/fichier/2017-10-03_Opens.tsv',
'/home/fichier/2017-10-05_Opens.tsv',
'/home/fichier/2017-10-06_Opens.tsv',
'/home/fichier/2017-10-07_Opens.tsv',
);

/*
   you may use explode() also like below
   $last = explode('/',$val);
   $date = explode('_',$last[count($last)-1]);
   $date = strtotime( $date[0] );
   return  $date >= strtotime('2017-10-03') && $date <=  strtotime('2017-10-06');   
*/

$result = array_filter($range, function ($val){
    preg_match("/(\d{4}-\d{2}-\d{2})/", $val, $match);
    $date = strtotime($match[0]);
    return  $date >= strtotime('2017-10-03') && $date <=  strtotime('2017-10-06');  
});

print_r($result);

// to reset keys use : print_r(array_values($result))

?>

Output:

Array
(
    [2] => /home/fichier/2017-10-03_Opens.tsv
    [3] => /home/fichier/2017-10-05_Opens.tsv
    [4] => /home/fichier/2017-10-06_Opens.tsv
)

Upvotes: 1

Related Questions