laravel 使用集合2中的值更新集合1

xtupzzrd  于 2023-03-13  发布在  其他
关注(0)|答案(4)|浏览(136)

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作为数组的集合,它应该是一个类,而且值也没有更新。我不认为这会是如此棘手,但我似乎不能让它返回与原始格式相同的格式。更新也失败了。

gab6jxml

gab6jxml1#

可以使用数组合并和data_get
下面是一个基本示例

$array1 = collect([
    ['key1' => 0, 'key2' => 1],
    [],
    [],
    ['key1' => 6, 'key2' => 7],
]);

$array2 = collect([
    ['key1' => 11, 'key2' => 10],
    ['key1' => 2, 'key2' => 3],
    ['key1' => 4, 'key2' => 5],
    ['key1' => 12, 'key2' => 13],
    ['key1' => 14, 'key2' => 15],
]);

基于array 1集合项的合并(array 2项值将覆盖array 1项);

return $array1->map( fn($item, $key) => array_merge($item, data_get($array2, $key) ?? [] ) );

//output
[
    { key1: 11, key2: 10 },
    { key1: 2, key2: 3 },
    { key1: 4, key2: 5 },
    { key1: 12, key2: 13 }
]

基于array 2集合项的合并(array 1项值将覆盖array 2项);

return $array2->map( fn($item, $key) => array_merge($item, data_get($array1, $key) ?? [] ) );
//output
[
    { key1: 0, key2: 1 },
    { key1: 2, key2: 3 },
    { key1: 4, key2: 5 },
    { key1: 6, key2: 7 },
    { key1: 14, key2: 15 }
]

另外,发布您尝试合并的集合的实际结果,
你就能让他们

return [
    'c1' => $collection1,
    'c2' => $collection2
];

dd( $collection1->toArray(), $collection2->toArray() );
kknvjkwl

kknvjkwl2#

我会尝试以例子来回答这个问题

$collection1 = collect([
    ['id' => 1, 'name' => 'John'],
    ['id' => 2, 'name' => 'Jane'],
    ['id' => 3, 'name' => 'Bob'],
]);

$collection2 = collect([
    ['id' => 1, 'name' => 'John Doe'],
    ['id' => 3, 'name' => 'Bob Smith'],
]);

$updatedCollection1 = $collection1->map(function ($item) use ($collection2) {
    $matchingItem = $collection2->where('id', $item['id'])->first();
    if ($matchingItem) {
        return array_merge($item, $matchingItem);
    }
    return $item;
});

// $updatedCollection1 now contains the following values:
// [
//     ['id' => 1, 'name' => 'John Doe'],
//     ['id' => 2, 'name' => 'Jane'],
//     ['id' => 3, 'name' => 'Bob Smith'],
// ]

这种方法使用唯一密钥(这里id是唯一的)

am46iovg

am46iovg3#

由于您有2个集合,可以简单地使用merge of Collection将这2个集合合并在一起:https://laravel.com/docs/master/collections#method-merge
从描述来看
[...]如果给定项中的字符串键与原始集合中的字符串键匹配,则给定项的值将覆盖原始集合中的值[...]
所以,据我所知,这正是你想得到的。

r9f1avp5

r9f1avp54#

因为$matchingItem和$item是一个类示例,要使用array_merge,需要将它们转换为array,要得到对象响应,需要将array_merge的结果转换为object

$updatedCollection = $collection1->map(function ($item) use ($collection2) {
    $matchingItem = $collection2->where('id', $item['id'])->first();
    
    if ($matchingItem) {
        return (object) array_merge((array) $item, (array) $matchingItem);
    }
    
    return $item;
});

相关问题