Группировка по сумме в коллекции - PullRequest
0 голосов
/ 07 февраля 2019

Я не знаю, есть ли простой способ выполнить то, что я пытаюсь сделать, поэтому я подумал, что я мог бы также спросить.Я искал ответ на этот вопрос, но не смог найти что-то похожее.

У меня есть переменная с именем $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 Ответ

0 голосов
/ 07 февраля 2019

Вы могли бы достичь этого с помощью чего-то подобного:

$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.Это все еще будет работать.

Вот также пример , с которым вы можете играть.

...