带有 DATE COMPARE 条件的 FOREACH (PHP)

Posted

技术标签:

【中文标题】带有 DATE COMPARE 条件的 FOREACH (PHP)【英文标题】:FOREACH with a DATE COMPARE condition (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,对吧? 【参考方案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 个在比较范围内 但是这样会在过滤结果之前将其截断,对吗? 嗯,我想把过滤后的结果剪掉

以上是关于带有 DATE COMPARE 条件的 FOREACH (PHP)的主要内容,如果未能解决你的问题,请参考以下文章

带有IF条件的MYSQL求和查询

创建带有条件的 SQL 视图

带有条件的 Laravel 连接查询

How to compare dates in Java

使用带有用户定义条件的 Count 从 sql 生成频率表

C语言的compare函数是在哪里定义的?算法是啥?