按列值前导字符对数据行进行分组

3

我有一个如下所示的数组,我想要做的是根据timestamp列的日期子字符串(例如2011-02-04)创建多个子数组:

Array
(
    [0] => Array
        (
            [avgvalue] => 0
            [maxvalue] => 0
            [minvalue] => 0
            [nrsamples] => 0
            [stddeviation] => 0
            [timestamp] => 2011-02-04T11:00:00.000Z
        )

    [1] => Array
        (
            [avgvalue] => 268.3
            [maxvalue] => 268.3
            [minvalue] => 268.3
            [nrsamples] => 0
            [stddeviation] => 0
            [timestamp] => 2011-02-04T12:00:00.000Z
        )

    [2] => Array
        (
            [avgvalue] => 268.391666667
            [maxvalue] => 268.4
            [minvalue] => 268.3
            [nrsamples] => 0.0288675134595
            [stddeviation] => 0.0288675134595
            [timestamp] => 2011-02-04T13:00:00.000Z
        )

    [3] => Array
        (
            [avgvalue] => 268.433333333
            [maxvalue] => 268.5
            [minvalue] => 268.4
            [nrsamples] => 0.0492365963918
            [stddeviation] => 0.0492365963918
            [timestamp] => 2011-02-04T14:00:00.000Z
        )

    [4] => Array
        (
            [avgvalue] => 268.5
            [maxvalue] => 268.5
            [minvalue] => 268.5
            [nrsamples] => 0
            [stddeviation] => 0
            [timestamp] => 2011-02-04T15:00:00.000Z
        )

    [5] => Array
        (
            [avgvalue] => 268.575
            [maxvalue] => 268.6
            [minvalue] => 268.5
            [nrsamples] => 0.0452267016867
            [stddeviation] => 0.0452267016867
            [timestamp] => 2011-02-04T16:00:00.000Z
        )

    [6] => Array
        (
            [avgvalue] => 268.616666667
            [maxvalue] => 268.7
            [minvalue] => 268.6
            [nrsamples] => 0.0389249472081
            [stddeviation] => 0.0389249472081
            [timestamp] => 2011-02-04T17:00:00.000Z
        )

    [7] => Array
        (
            [avgvalue] => 268.7
            [maxvalue] => 268.7
            [minvalue] => 268.7
            [nrsamples] => 0
            [stddeviation] => 0
            [timestamp] => 2011-02-04T18:00:00.000Z
        )

    [8] => Array
        (
            [avgvalue] => 268.741666667
            [maxvalue] => 268.8
            [minvalue] => 268.7
            [nrsamples] => 0.0514928650545
            [stddeviation] => 0.0514928650545
            [timestamp] => 2011-02-04T19:00:00.000Z
        )

    [9] => Array
        (
            [avgvalue] => 268.8
            [maxvalue] => 268.8
            [minvalue] => 268.8
            [nrsamples] => 0
            [stddeviation] => 0
            [timestamp] => 2011-02-04T20:00:00.000Z
        )

    [10] => Array
        (
            [avgvalue] => 268.883333333
            [maxvalue] => 268.9
            [minvalue] => 268.8
            [nrsamples] => 0.0389249472081
            [stddeviation] => 0.0389249472081
            [timestamp] => 2011-02-04T21:00:00.000Z
        )
 )

上述数组中的每个子数组都有一个时间戳键。我将时间戳值分解为日期和时间,现在我遇到了将数组拆分为子数组的困难。
我的目标是拥有一个数组包含2011-02-04这一日期的所有值,另一个数组包含2011-02-05这一日期的所有值。这可以是动态的,也就是说日期可能会更多。那么,我该怎么做呢?
我希望得到的结果如下:
array[0] => array(... list of all the values for 2011-02-04),
array[1] => array(...list of all values for 2011-02-05)
2个回答

7
假设所有条目的日期格式都相同(这似乎是这样),您可以简单地循环遍历数组:
$result = array();

foreach($array as $item) {
    $date = strstr($item['timestamp'], 'T', true);
    if(!array_key_exists($date, $result)) {
        $result[$date] = array();
    }
    $result[$date][] = $item;
}

参考:strstrarray_key_exists

根据原始数组中项目的顺序,您可能需要使用 ksort$result 数组按照时间顺序进行排序。


如果使用方括号语法,可以在不显式声明父元素的情况下推送子元素,因此if(!array_key_exists($date, $result)) { $result[$date] = array(); }是不必要的。 - mickmackusa

0

在将新的子数组推入日期键控的子数组之前,无需检查数组键是否存在。

解决方案就像这样简单:(演示)

$result = [];
foreach ($array as $row) {
    $result[substr($row['timestamp'], 0, 10)][] = $row;
}

分组后,如果您想对组进行排序,请使用ksort($result)进行升序或krsort($result)进行降序。如果您想重新索引第一级键,请使用$result = array_values($result)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接