Поиск файлов на основе даты в имени файла

#php #datetime

#php #дата-время

Вопрос:

У меня есть 100 текстовых файлов в каталоге.

Формат имени файла является abcd_2011_04_20.txt

Мне нужно прочитать только СЕГОДНЯШНИЙ файл и файлы за последние 7 дней. Как мне это сделать? РЕДАКТИРОВАТЬ 1 :

У меня уже есть функция dirTxt(dirname), которая возвращает имена файлов в виде массива. Как мне определить файл, соответствующий текущей дате?? а затем получить файлы за предыдущие 7 дней??

РЕДАКТИРОВАТЬ 2 :

Массив возвращает следующее

‘graph.txt ‘ ‘graph1.txt ‘ ‘abcd_2011-04-12.txt ‘ ‘abcd_2011-04-13.txt ‘ ‘abcd_2011-04-24.txt ‘ ‘abcd_2011-04-15.txt ‘ ‘abcd_2011-04-16.txt ‘ ‘abcd_2011-04-17.txt ‘ ‘abcd_2011-04-18.txt ‘ ‘abcd_2011-04-19.txt ‘ ‘abcd_2011-04-20.txt ‘

Ответ №1:

Пример

 $dt = time();   // today... or use $dt = strtotime('2010-04-20'); to set custom start date.
$past_days = 7; // number of past days
$filesindir = dirTxt('your_dir');

for ($i=0; $i<=$past_days; $i  ) {
  $filename = 'abcd_' . date('Y_m_d', $dt) . '.txt';
  $files[] = $filename;
  $dt = strtotime('-1 day', $dt);
  } 

$files = array_intersect($filesindir, $files);

print_r($files);
  

Вывод (может быть таким, зависит от массива $filesindir)

 Array
(
    [0] => abcd_2011_04_21.txt
    [1] => abcd_2011_04_20.txt
    [2] => abcd_2011_04_18.txt
    [3] => abcd_2011_04_15.txt
)
  

Комментарии:

1. Привет, но проблема в том, что у меня есть функция под названием dirTxt (), которая возвращает имя каждого отдельного текстового файла в этом каталоге… Как мне определить файл текущего дня, а затем получить файлы за последние 7 дней??? пожалуйста, помогите

2. @Zac, не могли бы вы опубликовать в своем вопросе часть этого списка? У каждого файла есть префикс «abcd_» (или вообще один и тот же префикс)?

3. Но у меня есть функция dirTxt(dirname), которая возвращает имена файлов в виде массива. Как мне определить файл, соответствующий текущей дате?? а затем получить файлы за предыдущие 7 дней??

4. @Zac, посмотри на результат моего ответа? Есть ли у вас этот формат имени файла в вашем файловом массиве? Есть имена файлов за сегодняшний день и 7 дней назад. Вы можете просто использовать это?

5. Я тебя не понимаю… Я добавил это в ваш код…. но это не сработает .. $text11 is the individual filename > $filename = ‘abcd_’ . date(‘Y_m_d’, $dt) . ‘.txt’; if ( $filename == $text11) { echo «$filename <br />»; // сделайте что -нибудь с $filename // … еще код … $dt = strtotime(‘-1 день’, $dt); }

Ответ №2:

Я создал вспомогательную функцию на случай, если вам понадобится где-нибудь снова ее использовать. Если нет, вы могли бы легко поместить его код внутри тела цикла.

 function getFileName($unixTime) {
    return 'abcd_' . date('Y_m_j', $unixTime) . '.txt';
} 

$files = array();
foreach(range(0, 6) as $dayOffset) {
   $files[] = getFileName(strtotime('-' . $dayOffset . ' day'));
}

var_dump($files)
  

CodePad.

Выходной сигнал

 array(7) {
  [0]=>
  string(19) "abcd_2011_04_21.txt"
  [1]=>
  string(19) "abcd_2011_04_20.txt"
  [2]=>
  string(19) "abcd_2011_04_19.txt"
  [3]=>
  string(19) "abcd_2011_04_18.txt"
  [4]=>
  string(19) "abcd_2011_04_17.txt"
  [5]=>
  string(19) "abcd_2011_04_16.txt"
  [6]=>
  string(19) "abcd_2011_04_15.txt"
  

Обновить

Что касается их чтения, просто выполните цикл…

 foreach($files as $file) {
   if ( ! is_file($file)) {
       continue;
   }
   $contents = file_get_contents($file);
}
  

Комментарии:

1. Но у меня есть функция dirTxt(dirname), которая возвращает имена файлов в виде массива. Как мне определить файл, соответствующий текущей дате?? а затем получить файлы за предыдущие 7 дней ??….

2. @Zac Вы можете использовать мою вспомогательную функцию для текущего файла … getFileName(time()) .

Ответ №3:

 $filename = 'abcd_' . date('Y_m_d') . '.txt';
if (!file_exists($filename)) {
    die("File $filename does not exist");
}

$contents = file_get_contents($filename);
  

Используйте date('Y_m_d', strtotime('-2 days')) для получения других дат.

Ответ №4:

Извлеките дату из имени файла и сравните ее с сегодняшней датой.

Для этого в PHP есть функции обработки строк и функции даты / времени.


 <?php
function isWithinLastSevenDays($str) {
   $pos = strpos($str, "_");
   if ($pos === FALSE)
      throw new Exception("Invalid filename format");

   $str = str_replace('_', '-', substr($str, $pos 1, strlen($str)-$pos-1-4));
   $d1 = new DateTime($str);
   $d2 = new DateTime();
   $d2->modify('-7 days'); // sub() only since PHP 5.3

   return ($d2 < $d1);
}

$str = "abcd_2011_04_20.txt";
var_dump(isWithinLastSevenDays($str));

$str = "abcd_2011_04_10.txt";
var_dump(isWithinLastSevenDays($str));

/*
Output:

bool(true)
bool(false)
*/
?>