在集合中分组并求和
Group by and sum in a collection
我不知道是否有一种简单的方法可以完成我想做的事情,所以我想我不妨问问。我确实搜索了这个问题的答案,但我找不到类似的东西。
我有一个名为 $data
的变量,它包含一个看起来像这样的集合:
[
"date" => "2017-10-07 10:00:00"
"usage" => 0.423
"costs" => 1.212
],
[
"date" => "2017-10-07 11:00:00"
"usage" => 0.786
"costs" => 1.564
],
[
"date" => "2017-10-07 12:00:00"
"usage" => 0.542
"costs" => 1.545
]
(数据可以是每小时,最多 2 个月,为了便于阅读,我在这个例子中选择只包括 3 小时)
如你所见,都是每小时(这也是我在代码中不同部分需要的数据)我想要一个单独的集合每天。有没有一种简单的方法可以按日期 ('Ymd') 分组并对 usage
和 costs
求和?我还应该提到 并非集合中的所有项目都具有所有索引 。有的没有usage
,有的没有costs
。然而,所有人都有 date
。
您可以通过以下方式实现此目的:
$collection = collect([
[
"date" => "2017-10-07 10:00:00",
"usage" => 0.423,
"costs" => 1.212
],
[
"date" => "2017-10-07 11:00:00",
"usage" => 0.786,
"costs" => 1.564
],
[
"date" => "2017-10-07 12:00:00",
"usage" => 0.542,
"costs" => 1.545
],
[
"date" => "2017-10-08 10:00:00",
"costs" => 1.1
],
[
"date" => "2017-10-08 11:00:00",
"usage" => 0.786,
],
[
"date" => "2017-10-08 12:00:00",
"costs" => 1.567
]
]);
return $collection->groupBy(function($row) {
return Carbon\Carbon::parse($row['date'])->format('Y-m-d');
})->map(function($value, $key) {
return [
'usage' => $value->sum('usage'),
'costs' => $value->sum('costs')
];
});
上面的输出将是这样的:
Collection {#267 ▼
#items: array:2 [▼
"2017-10-07" => array:2 [▶]
"2017-10-08" => array:2 [▼
"usage" => 0.786
"costs" => 2.667
]
]
}
从上面可以看出,有些项目没有usage
或costs
。它仍然会起作用。
这里还有一个 example 你可以玩。
我不知道是否有一种简单的方法可以完成我想做的事情,所以我想我不妨问问。我确实搜索了这个问题的答案,但我找不到类似的东西。
我有一个名为 $data
的变量,它包含一个看起来像这样的集合:
[
"date" => "2017-10-07 10:00:00"
"usage" => 0.423
"costs" => 1.212
],
[
"date" => "2017-10-07 11:00:00"
"usage" => 0.786
"costs" => 1.564
],
[
"date" => "2017-10-07 12:00:00"
"usage" => 0.542
"costs" => 1.545
]
(数据可以是每小时,最多 2 个月,为了便于阅读,我在这个例子中选择只包括 3 小时)
如你所见,都是每小时(这也是我在代码中不同部分需要的数据)我想要一个单独的集合每天。有没有一种简单的方法可以按日期 ('Ymd') 分组并对 usage
和 costs
求和?我还应该提到 并非集合中的所有项目都具有所有索引 。有的没有usage
,有的没有costs
。然而,所有人都有 date
。
您可以通过以下方式实现此目的:
$collection = collect([
[
"date" => "2017-10-07 10:00:00",
"usage" => 0.423,
"costs" => 1.212
],
[
"date" => "2017-10-07 11:00:00",
"usage" => 0.786,
"costs" => 1.564
],
[
"date" => "2017-10-07 12:00:00",
"usage" => 0.542,
"costs" => 1.545
],
[
"date" => "2017-10-08 10:00:00",
"costs" => 1.1
],
[
"date" => "2017-10-08 11:00:00",
"usage" => 0.786,
],
[
"date" => "2017-10-08 12:00:00",
"costs" => 1.567
]
]);
return $collection->groupBy(function($row) {
return Carbon\Carbon::parse($row['date'])->format('Y-m-d');
})->map(function($value, $key) {
return [
'usage' => $value->sum('usage'),
'costs' => $value->sum('costs')
];
});
上面的输出将是这样的:
Collection {#267 ▼
#items: array:2 [▼
"2017-10-07" => array:2 [▶]
"2017-10-08" => array:2 [▼
"usage" => 0.786
"costs" => 2.667
]
]
}
从上面可以看出,有些项目没有usage
或costs
。它仍然会起作用。
这里还有一个 example 你可以玩。