我想循环遍历foreach并按日期对结果进行分组。
示例:
2017-10-05
2017-10-05
2017-10-07
2017-10-10
2017-10-10
2017-10-10
......等等
由于我不知道如何实现这一点,因此我只有一个foreach循环的标准代码。我应该指出数据来自XML提要。
foreach($streamData->channel->item as $item) {
echo $item->date.'<br>';
}
上面的代码打印出这样的日期:
2017-10-05
2017-10-05
2017-10-07
2017-10-10
2017-10-10
2017-10-10
......等等
如示例所示,我如何实现这一目标?
答案 0 :(得分:0)
由于我没有任何对象数据要测试,我不确定它是否有效,但可能......
编辑我在阵列上测试过,看起来我错了。这是在数组上工作的内容;
https://3v4l.org/VSJeQ
我想我把你的对象与这个数组相匹配。
foreach($streamData->channel->item as $item) {
echo item->date.'<br>';
if(next($streamData)->date != $item->date) echo '<br>';
}
基本上使用next()来查看下一个项目是否与当前项目不同。如果确实如此,请添加另一个<br>
编辑;现在考虑它可能需要更改为next($ item)而不是next($ item-&gt; date)
答案 1 :(得分:0)
如果你想做的就是决定何时进行事件处理,那么这就是你可能会使用的那种构造。
$last_date = null;
foreach($streamData->channel->item as $item) {
if ( $last_date != $item->date ) {
echo '<br>' . $item->date . '<br>';
}
$last_date = $item->date;
// do event processing
}
这可能的准确程度取决于您从何处获取活动信息。
答案 2 :(得分:0)
另一个可能的解决方案是创建一个地图,并将每个日期分组存储为地图的成员。这些成员的值将是日期数组,可以通过日期月份键在常量时间O(1)中访问,以后当您要搜索组或类似内容时不需要循环。
例如,这是我所想的JSON表示:
{
"10": [
"2017-10-10",
"2017-10-10",
"2017-10-10",
],
"9": [
"2017-10-9",
"2017-10-9",
"2017-10-9",
],
// ...
}
现在你可以简单地做一个循环,比如“对于这个对象的每个组”,然后“对于这个组的每个日期”。