Групповой сбор по нескольким колонкам - Laravel - PullRequest
0 голосов
/ 04 февраля 2019

Итак, у меня есть эта коллекция в laravel:

$collection = [
 {OC: "3.01", C: "922.76", D: "0"},
 {OC: "3.01", C: "0", D: "78004027.00"},
 {OC: "3.02", C: "0", D: "116442.60"},
 {OC: "3.03", C: "0", D: "833.83"},
 {OC: "3.04", C: "772.50", D: "0"},
 {OC: "3.04", C: "0", D: "3345.50"}
];

Мне нужно сгруппировать, поэтому у меня есть один OC в своем роде, у каждой может быть одна или две записи (одна для C! = 0 иодин для D! = 0), в данном случае, например, ожидаемый результат:

$collection = [
 {OC: "3.01", C: "922.76", D: "78004027.00"},
 {OC: "3.02", C: "0", D: "116442.60"},
 {OC: "3.03", C: "0", D: "833.83"},
 {OC: "3.04", C: "772.50", "3345.50"},
];

Какой самый эффективный способ я могу это сделать?Может кто-то, пожалуйста, пролить свет, я пытался использовать -> groupBy, но я могу только группировать по OC, и это не решает мою проблему

очень ценится

Ответы [ 2 ]

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

Это тоже работает!

   $results = $collection->groupBy('OC')->map(function($array){

        $result = [];

        foreach($array[0] as $key => $arr){
          $result += [$key => $array->max($key)];
        }
        return $result;

    })->values();
0 голосов
/ 04 февраля 2019

Вы можете использовать reduce функцию ... что-то вроде: (не проверено)

Если ваши данные являются коллекцией:

$modified = $collection->reduce(function ($carry, $item) {
    if(empty($carry[$item->OC])){ //Not on the final array
       //Create it
       $carry[$item->OC] = $item;
    } else { //Exists, then update C/D with maximum value
       $carry[$item->OC]->C = max($carry[$item->OC]->C, $item->C); 
       $carry[$item->OC]->D = max($carry[$item->OC]->D, $item->D); 
    } 

    return $carry;
}, [])->values();

Или если ваши данные являются массивом:

$modified = array_values($collection, array_reduce(function ($carry, $item) {
    if(empty($carry[$item->OC])){ //Not on the final array
       //Create it
       $carry[$item->OC] = $item;
    } else { //Exists, then update C/D with maximum value
       $carry[$item->OC]->C = max($carry[$item->OC]->C, $item->C); 
       $carry[$item->OC]->D = max($carry[$item->OC]->D, $item->D); 
    } 

    return $carry;
}, []));

Тогда у вас есть значения в $modified var.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...