我有一个像这样的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
答案 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(),因为它恰好是一点点 更快。