bounty将在3天后过期。回答此问题可获得+50的声望奖励。morne正在寻找规范答案。
首先,让我为这张照片道歉。我知道它不应该这样发布。
下面我有两个集合。我想用collection2
中的值更新collection1
中的键-〉值对。Collection1
包含更多项,包括collection2
中的项collection2
中的密钥100%存在于collection1
中。
我尝试了一些建议,但没有成功,如
$updatedCollection = $collection1->map(function ($item) use ($collection2) {
$matchingItem = $collection2->where('id', $item['id'])->first();
if ($matchingItem) {
return array_merge($item, $matchingItem);
}
return $item;
});
以及
$res = $collection1->map(function ($item) use ($collection2) {
$item = (array)$item;
$matchingItem = $collection2->where('id', $item['id'])->first();
if ($matchingItem) {
return array_merge($item, $matchingItem);
}
$itemZ[] = (object)$item;
$itemZZ = (object)$itemZ;
$itemZZZ = collect($itemZ);
return $itemZZZ;
});
但大多数时候我得到的是一个items
作为数组的集合,它应该是一个类,而且值也没有更新。我不认为这会是如此棘手,但我似乎不能让它返回与原始格式相同的格式。更新也失败了。
4条答案
按热度按时间gab6jxml1#
可以使用数组合并和data_get
下面是一个基本示例
基于array 1集合项的合并(array 2项值将覆盖array 1项);
基于array 2集合项的合并(array 1项值将覆盖array 2项);
另外,发布您尝试合并的集合的实际结果,
你就能让他们
或
kknvjkwl2#
我会尝试以例子来回答这个问题
这种方法使用唯一密钥(这里id是唯一的)
am46iovg3#
由于您有2个集合,可以简单地使用
merge
of Collection将这2个集合合并在一起:https://laravel.com/docs/master/collections#method-merge从描述来看
[...]如果给定项中的字符串键与原始集合中的字符串键匹配,则给定项的值将覆盖原始集合中的值[...]
所以,据我所知,这正是你想得到的。
r9f1avp54#
因为$matchingItem和$item是一个类示例,要使用array_merge,需要将它们转换为array,要得到对象响应,需要将array_merge的结果转换为object