Коллекция Laravel Lumen — Сгруппируйте по Сумме и сохраните значения

#php #laravel #lumen

Вопрос:

Я работаю над Lumen, и в моей коллекции есть повторяющиеся значения, пример:

 collect([
 [
        'name' => 'John Doe',
        'department' => 'Sales',
        'phone' => '99999-99999',
        'value' => 25.0
    ],
    [
        'name' => 'Mary Lisa',
        'department' => 'Finance',
        'phone' => '88888-88888',
        'value' => 5.0
    ],
    [
        'name' => 'Mary Lisa',
        'department' => 'Finance',
        'phone' => '88888-88888',
        'value' => 58.0
    ],
    [
        'name' => 'Lucas Rodrigues',
        'department' => 'Marketing',
        'phone' => '22222-22222',
        'value' => 90.0
    ]
])
 

Я хотел бы суммировать значение свойства, когда имя совпадает, но сохранить другие значения, такие как (отдел и телефон), и удалить дубликаты сущности, например:

 collect([
 [
        'name' => 'John Doe',
        'department' => 'Sales',
        'phone' => '99999-99999',
        'value' => 25.0
    ],
    [
        'name' => 'Mary Lisa',
        'department' => 'Finance',
        'phone' => '88888-88888',
        'value' => 63.0
    ],
    [
        'name' => 'Lucas Rodrigues',
        'department' => 'Marketing',
        'phone' => '22222-22222',
        'value' => 90.0
    ]
])
 

Как лучше всего это сделать?

Ответ №1:

Попробуйте выполнить следующие действия:

 $newCollection = collect([]);
$collectctions = collect([
    [
        'name' => 'John Doe',
        'department' => 'Sales',
        'phone' => '99999-99999',
        'value' => 25.0
    ],
    [
        'name' => 'Mary Lisa',
        'department' => 'Finance',
        'phone' => '88888-88888',
        'value' => 5.0
    ],
    [
        'name' => 'Mary Lisa',
        'department' => 'Finance',
        'phone' => '88888-88888',
        'value' => 58.0
    ],
    [
        'name' => 'Lucas Rodrigues',
        'department' => 'Marketing',
        'phone' => '22222-22222',
        'value' => 90.0
    ]
]);

foreach ($collectctions as $item) {
    if($newCollection->contains('name', $item['name'])){
        $index = $newCollection->where('name', $item['name'])->keys()[0];

        $newCollection = $newCollection->map(function ($object, $i) use ($index, $item) {
            if($i == $index){
                $object['value']  = $item['value'];
            }

            return $object;
        });

    }
    else{
        $newCollection->push($item);
    }
}

return $newCollection;
 

Ответ №2:

Это может быть достигнуто с помощью функций сбора (https://laravel.com/docs/8.x/collections). В этом примере я решил ее с помощью ( groupBy , map , flatten , slice , count и sum ).

 $data = collect([
    [
        'name' => 'John Doe',
        'department' => 'Sales',
        'phone' => '99999-99999',
        'value' => 25.0
    ],
    [
        'name' => 'Mary Lisa',
        'department' => 'Finance',
        'phone' => '88888-88888',
        'value' => 5.0
    ],
    [
        'name' => 'Mary Lisa',
        'department' => 'Finance',
        'phone' => '88888-88888',
        'value' => 58.0
    ],
    [
        'name' => 'Lucas Rodrigues',
        'department' => 'Marketing',
        'phone' => '22222-22222',
        'value' => 90.0
    ]
]);

$data = $data->groupBy('name')->map(function ($item) {
    if ($item->count() > 1) {
        $item = $item->slice(0, 1)->map(function($subItem) use ($item) {
            $subItem['value'] = $item->sum('value');

            return $subItem;
        });
    }

    return $item;
})
->flatten(1);
 

При вызове print_r($data->toArray()); мы получаем в результате следующий массив:

 Array
(
    [0] => Array
        (
            [name] => John Doe
            [department] => Sales
            [phone] => 99999-99999
            [value] => 25
        )

    [1] => Array
        (
            [name] => Mary Lisa
            [department] => Finance
            [phone] => 88888-88888
            [value] => 63
        )

    [2] => Array
        (
            [name] => Lucas Rodrigues
            [department] => Marketing
            [phone] => 22222-22222
            [value] => 90
        )

)
 

Комментарии:

1. Мило! Спасибо вам 😉