php使用多维数组的SUM组

时间:2011-03-11 05:08:06

标签: php arrays

我有一个像这样的php数组:

 Array
    (
        [0] => Array
            (
                [url_id] => 2191238
                [time_spent] => 41

            )

        [1] => Array
            (
                [url_id] => 2191606
                [time_spent] => 215

            )
        [2] => Array
            (
                [url_id] => 2191606
                [time_spent] => 25

            )
    )

那么,如何根据url_id的group(使用array_count_values)获取time_spent的SUM

3 个答案:

答案 0 :(得分:7)

让我们假装$array包含我们的数据。我们将遍历数组并不断将time_spent添加到由url_id键入的另一个数组中。

$ts_by_url = array();
foreach($array as $data) {
    if(!array_key_exists($data['url_id'], $ts_by_url))
        $ts_by_url[ $data['url_id'] ] = 0;
    $ts_by_url[ $data['url_id'] ] += $data['time_spent'];
}

$ts_by_url现在应该包含:

2191238 => 41
2191606 => 240 // == 215 + 25

答案 1 :(得分:1)

为什么不简单

$ts_by_url = array();
foreach($array as $data) {
    $ts_by_url[ $data['url_id'] ] += $data['time_spent'];
}

答案 2 :(得分:0)

OP发布了一个有趣的问题,但使用array_count_values()的建议不适用;该函数不对数组值求和,但计算其频率。 @marcocassisa的答案有效但由于E_NOTICES的不幸排放而不足,尽管与任何数学问题无关。 (未定义的变量未设置,因此为NULL值,但在数学上下文中,它将暂时强制为零值。)现代PHP通过在代码使用时有意提出通知来阻止使用未定义的变量,只有一个例外PHP 5.1:仅包含未定义变量的语句;见here

为了纠正上述解决方案,可以使用两个 foreach 循环,一个用于设置索引键并初始化数组元素,而另一个用于执行值的求和,如下所示:

<?php

// set keys and initialize
foreach($arr as $data) {
    $its_by_url[ $data["url_id"] ] = 0;
} 

// now can sum values by url id number:
foreach($arr as $data) {
    $its_by_url[ $data["url_id"] ] += $data["time_spent"];
}

请参阅demo

虽然令人满意,但这种解决方案缺乏优雅。尝试将两个 foreach 循环合并为一个会对第二个元素产生负面影响,因为它被定义然后不必要地重新定义。可以根据@Charles的答案进行编码,并创建url id编号索引(如果它尚未存在)。或者,您可以测试是否已设置,如下所示:

<?php
foreach($arr as $data) {
   if ( !isset( $its_by_url[ $data["url_id"] ] ) ) {
             $its_by_url[ $data["url_id"] ] = 0;
   }
   $its_by_url[ $data["url_id"] ] += $data["time_spent"]; 
}

请参阅demo

注意:如果数组元素被定义为null,则isset()将返回false,而array_key_exists()将返回true。每,Ilia Alshanetsky

  

...如果您的申请不需要区分   不存在的数组键和值恰好是的数组键   NULL你应该使用isset(),因为它恰好是一点点   更快。