FOREACH с условием СРАВНЕНИЯ ДАТЫ (PHP)

У меня есть JSON-источник, и я пытаюсь зациклить его и показать некоторые результаты (до 9 результатов), что не является проблемой

Проблема в том, что я хочу показать только результаты, которые соответствуют определенной дате, где дата может быть точной или между 2 датами.

Например, я хочу показать только те события, где, скажем, дата 2019-11-17 находится в пределах timeFrom timeTo события или timeFrom или timeTo равно ему. В этом примере это будут события 1 и 3

Это исходный образец

{  
      "title":"event 1",
      "timeFrom":"2019-11-16 19:00:00",
      "timeTo":"2019-11-18 22:00:00",
      "listText":"text of the event",
      "url":"https://url",
      "imageUrl":"https://image.jpg",
      "locations":{  
         "title":"Location name",
         "url":"https://location"
      }
   },
      {  
      "title":"event 2",
      "timeFrom":"2019-11-20 19:00:00",
      "timeTo":"2019-11-20 22:00:00",
      "listText":"text of the event",
      "url":"https://url",
      "imageUrl":"https://image.jpg",
      "locations":{  
         "title":"Location name",
         "url":"https://location"
      }
   },
      {  
      "title":"event 3",
      "timeFrom":"2019-11-17 19:00:00",
      "timeTo":"2019-11-17 22:00:00",
      "listText":"text of the event",
      "url":"https://url",
      "imageUrl":"https://image.jpg",
      "locations":{  
         "title":"Location name",
         "url":"https://location"
      }

И это то, что у меня есть на данный момент

foreach(array_slice($arr, 0, 9) as $data) {  

            //then I will show the result
        }

Итак, я не могу понять, как создать это условие в foreach.

4 голоса | спросил lStoilov 26 MaramTue, 26 Mar 2019 10:44:05 +03002019-03-26T10:44:05+03:0010 2019, 10:44:05

2 ответа


0

Попробуйте этот код:

$date = "2019-11-17";

$events = json_decode($json_output, true);

foreach ($events as $event)
{
    if (($date > $event['timeFrom'] && $date < $event['timeTo']) || in_array($date, array($event['timeFrom'], $event['timeTo'])))
    {
        $filtered_events[] = $event;
    }
}


$sliced_events = array_slice($filtered_events, 0, 9);

print_r($sliced_events);
ответил user2203703 26 MaramTue, 26 Mar 2019 11:06:00 +03002019-03-26T11:06:00+03:0011 2019, 11:06:00
0

Эта функция выполняет итерацию по данным о событиях, ища события, даты от и до которых окружают данную дату:

function find_events($events, $date) {
    $date = new DateTime($date);
    foreach ($events as $event) {
        $from = (new DateTime($event['timeFrom']))->setTime(0,0,0);
        $to = (new DateTime($event['timeTo']))->setTime(0,0,0);
        if ($date >= $from && $date <= $to) {
            echo "{$event['title']} ({$event['listText']}) from {$event['timeFrom']} to {$event['timeTo']}\n";
        }
    }
}
$events = json_decode($json, true);
find_events($events, '2019-11-17');

Вывод:

event 1 (text of the event) from 2019-11-16 19:00:00 to 2019-11-18 22:00:00 
event 3 (text of the event) from 2019-11-17 19:00:00 to 2019-11-17 22:00:00

Демонстрация на 3v4l.org

ответил Nick 26 MaramTue, 26 Mar 2019 10:53:59 +03002019-03-26T10:53:59+03:0010 2019, 10:53:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132