【问题标题】:FOREACH with a DATE COMPARE condition (PHP)带有 DATE COMPARE 条件的 FOREACH (PHP)
【发布时间】:2019-08-16 12:50:42
【问题描述】:

我有一个 JSON 源,我正在尝试循环遍历它并显示一些结果(最多 9 个结果),这不是问题

问题是我只想显示与某个日期匹配的结果,其中日期可能准确或介于两个日期之间。

例如,我只想显示日期 2019-11-17 在事件的 timeFrom timeTotimeFrom 内的事件strong> 或 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 中创建该条件。

【问题讨论】:

  • 您可以将所有日期转换为时间戳,然后检查 timeFrom 是否小于您提供的时间戳和 timeTo 是否大于您提供的时间戳
  • 不确定这是否适用于事件 3,因为时间戳会小于事件 3 的 timeFrom,对吧?

标签: php json loops foreach


【解决方案1】:

此函数遍历事件数据,查找起始日期和结束日期围绕给定日期的事件:

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

Demo on 3v4l.org

【讨论】:

  • 对于这组特定的数据,您可以将日期作为字符串进行比较,因为它们的格式适合:)
  • @Styx 在这种情况下你是绝对正确的。我确实需要从 JSON 中的日期中删除时间,但我可以使用 substr 来完成。如果日期格式不完全是Y-m-d H:i:s,这种方法应该更可靠
【解决方案2】:

试试这个代码:

$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);

【讨论】:

  • 这很好,但由于某种原因,array_slice 不起作用。有什么想法吗?
  • 在您的代码中,array_slice 只会为您提供前 9 个事件,与比较日期无关,您想将其包含在我的答案中吗?
  • 是的。那很好啊。我需要有前 9 个在比较范围内
  • 但是这样会在过滤结果之前将其截断,对吗?
  • 嗯,我想把过滤后的结果剪掉
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多