FOREACH с условием СРАВНЕНИЯ ДАТЫ (PHP) - PullRequest
4 голосов
/ 26 марта 2019

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

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

Например, я хочу показать только события, где, скажем, дата 2019-11-17 находится в пределах timeFo 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, который у меня есть в данный момент

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

            //then I will show the result
        }

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

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

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

1 голос
/ 26 марта 2019

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

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...