Laravel Lumen Collection - Group By With Sum 并保留值

Laravel Lumen Collection - Group By With Sum and preserve the values

我正在研究 Lumen,我的 collection 有重复值,例如:

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
    ]
])

我想在名称相同时对值 属性 求和,但保留其他值(如(部门和 phone)并删除重复的实体,例如:

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
    ]
])

最好的方法是什么?

尝试以下操作:

$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;

这可以使用集合函数 (https://laravel.com/docs/8.x/collections) 来实现。在此示例中,我使用 (groupBymapflattenslicecountsum).

解决了它
$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
        )

)