Группировка по сумме в коллекции
Я не знаю, есть ли простой способ выполнить то, что я пытаюсь сделать, поэтому я подумал, что я мог бы также спросить. Я действительно искал ответ на этот вопрос, но я не мог найти что-то подобное.
У меня есть переменная с именем $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
тем не мение.
1 ответ
Вы могли бы достичь этого с помощью чего-то вроде этого:
$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
, Это все еще будет работать.
Вот также пример, с которым вы можете играть.