带有 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 timeTo 或 timeFrom 内的事件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)的主要内容,如果未能解决你的问题,请参考以下文章