循环遍历foreach,然后将数据分组到日期数组中

时间:2017-08-10 13:59:37

标签: php arrays foreach

我想循环遍历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

......等等

如示例所示,我如何实现这一目标?

3 个答案:

答案 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",
    ],
    // ...
}

现在你可以简单地做一个循环,比如“对于这个对象的每个组”,然后“对于这个组的每个日期”。