Php 合并两个Laravel集合并求和值

Php 合并两个Laravel集合并求和值,php,arrays,laravel,collections,Php,Arrays,Laravel,Collections,我有10个集合(下面的例子中使用了3个)需要按键合并,但需要求和。我的收藏是这样的: [ 'key1' => ['value1' => 5, 'value2' => 3, 'value3' => 0], 'key2' => ['value1' => 1, 'value2' => 6, 'value3' => 2], 'key3' => ['value1' => 0, 'value2' => 0, 'valu

我有10个集合(下面的例子中使用了3个)需要按键合并,但需要求和。我的收藏是这样的:

[
    'key1' => ['value1' => 5, 'value2' => 3, 'value3' => 0],
    'key2' => ['value1' => 1, 'value2' => 6, 'value3' => 2],
    'key3' => ['value1' => 0, 'value2' => 0, 'value3' => 1],
]

[
    'key1' => ['value1' => 3, 'value2' => 1, 'value3' => 7],
    'key2' => ['value1' => 1, 'value2' => 3, 'value3' => 2],
    'key3' => ['value1' => 1, 'value2' => 6, 'value3' => 1],
]

[
    'key1' => ['value1' => 2, 'value2' => 3, 'value3' => 9],
    'key2' => ['value1' => 3, 'value2' => 8, 'value3' => 3],
    'key3' => ['value1' => 1, 'value2' => 0, 'value3' => 6],
]
[
    'key1' => ['value1' => 10, 'value2' => 7, 'value3' => 16],
    'key2' => ['value1' => 5, 'value2' => 17, 'value3' => 7],
    'key3' => ['value1' => 2, 'value2' => 6, 'value3' => 8],
]
我想得到一个结果如下的集合:

[
    'key1' => ['value1' => 5, 'value2' => 3, 'value3' => 0],
    'key2' => ['value1' => 1, 'value2' => 6, 'value3' => 2],
    'key3' => ['value1' => 0, 'value2' => 0, 'value3' => 1],
]

[
    'key1' => ['value1' => 3, 'value2' => 1, 'value3' => 7],
    'key2' => ['value1' => 1, 'value2' => 3, 'value3' => 2],
    'key3' => ['value1' => 1, 'value2' => 6, 'value3' => 1],
]

[
    'key1' => ['value1' => 2, 'value2' => 3, 'value3' => 9],
    'key2' => ['value1' => 3, 'value2' => 8, 'value3' => 3],
    'key3' => ['value1' => 1, 'value2' => 0, 'value3' => 6],
]
[
    'key1' => ['value1' => 10, 'value2' => 7, 'value3' => 16],
    'key2' => ['value1' => 5, 'value2' => 17, 'value3' => 7],
    'key3' => ['value1' => 2, 'value2' => 6, 'value3' => 8],
]
是否有我缺少的内置Laravel收集方法,或者实现这一点的最佳方法是什么

编辑:(更多信息)值始终是数字。任何集合中都没有字符串值

edit2:有些人问我试过什么。我试过这个方法,效果很好:

$merged = [];
foreach ($seeds as $seed) {
    foreach ($seed as $location => $values) {
        foreach ($values as $key => $value) {
            $merged[$location][$key] = $value + ($merged[$location][$key] ?? 0);
        }
    }
}

我只是想知道是否有一种更简洁的方法来实现同样的事情,而不是使用3个foreach循环。

真的认为有比循环更容易的方法,但似乎解决方案仍然比我提出的方法更好。即使更改深度,“展平”也会删除关键帧,“贴图组”仅在返回包含单个关键帧/值对的关联数组时起作用,“拾取”会带来一些其他困难,等等

这是我想到的

$test = collect([
   [
     'key1' => ['value1' => 5, 'value2' => 3, 'value3' => 0],
     'key2' => ['value1' => 1, 'value2' => 6, 'value3' => 2],
     'key3' => ['value1' => 0, 'value2' => 0, 'value3' => 1],
   ],

   [
     'key1' => ['value1' => 3, 'value2' => 1, 'value3' => 7],
     'key2' => ['value1' => 1, 'value2' => 3, 'value3' => 2],
     'key3' => ['value1' => 1, 'value2' => 6, 'value3' => 1],
   ],

   [
     'key1' => ['value1' => 2, 'value2' => 3, 'value3' => 9],
     'key2' => ['value1' => 3, 'value2' => 8, 'value3' => 3],
     'key3' => ['value1' => 1, 'value2' => 0, 'value3' => 6],
   ]
]);
$mappedCollection = collect($test->first())->keys()->mapWithKeys(function($item,$key) use($test){
   return[
      $item => $test->map(function ($mapItem, $mapKey) use($item) {         
         return $mapItem[$item];
      })
   ];
})->mapWithKeys(function($item,$key){
   $eachLine = collect($item->first())->keys()->mapWithKeys(function($mapItem) use($item){
      return[ $mapItem => $item->sum($mapItem)  ];
   });       
   return [$key =>  $eachLine];
})->all();

dd($mappedCollection);

收藏文档的来源

我用laravel 7做了这件事,以防它对某人有用

$test = collect([
   [
     'key1' => ['value1' => 5, 'value2' => 3, 'value3' => 0],
     'key2' => ['value1' => 1, 'value2' => 6, 'value3' => 2],
     'key3' => ['value1' => 0, 'value2' => 0, 'value3' => 1],
   ],

   [
     'key1' => ['value1' => 3, 'value2' => 1, 'value3' => 7],
     'key2' => ['value1' => 1, 'value2' => 3, 'value3' => 2],
     'key3' => ['value1' => 1, 'value2' => 6, 'value3' => 1],
   ],

   [
     'key1' => ['value1' => 2, 'value2' => 3, 'value3' => 9],
     'key2' => ['value1' => 3, 'value2' => 8, 'value3' => 3],
     'key3' => ['value1' => 1, 'value2' => 0, 'value3' => 6],
   ]
]);
$col = $test->reduce(function ($carry, $item) {
    return $carry->mergeRecursive($item);
}, collect([]));
$col->transform(function($item) {
    return collect($item)->map(function ($item2) {
        return collect($item2)->sum();
    });
});

你真的试过什么吗?你走了多远,你尝试了什么?你能告诉我们你为实现这一目标所做的努力吗?可能重复的@Option请参阅我的edit@rahulsm看我的编辑似乎是一个残酷的方式去做,但我接受了答案,因为你确实设法做到这一点拉威尔的收集。但我最终只使用了3个foreach循环。完全同意,使用foreach循环比使用foreach循环更容易。也许有一种更好(不是很明显)更简单的方法来处理laravel系列,但我把它留给了laravel的Jon Skeet,为什么不直接使用map和reduce呢?