@lexagl

Laravel найти в коллекциях по ключу и объединить в новую коллекцию?

Первая коллекция:

[
    "имя1" => "x"
    "объем1" => "x"
    "мусор" => "x"
    "мусор" => "x"
],
[
    "имя1" => "x"
    "объем1" => "x"
    "мусор" => "x"
    "мусор" => "x"
]

Вторая коллекция:

[
    "имя2" => "x"
    "мусор" => "x"
    "объем2" => "x"
    "мусор" => "x"
],
[
   "имя2" => "x"
    "мусор" => "x"
    "объем2" => "x"
    "мусор" => "x"
]

И таких коллекций несколько.
Ключи в них с нужными данными могут отличатся, но общее количество которое нужно выдернуть одинаковое.
Длины коллекций разные.

Я думал сначала изменить название ключей к единому знаменателю, а потом перебрать только нужные в новую коллекцию, но что то совсем запутался.

В конечном итоге нужно получить коллекцию объединенную по значению ключа "имя" добавив к нему значения "объем1" и "объем2".
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
grantur5707
@grantur5707
Full Stack Web Developer
use Illuminate\Support\Collection;

$collection1 = collect([
    [
        "имя1" => "John",
        "объем1" => "100",
        "мусор" => "x"
    ],
    [
        "имя1" => "Jane",
        "объем1" => "200",
        "мусор" => "y"
    ]
]);

$collection2 = collect([
    [
        "имя2" => "John",
        "объем2" => "300",
        "мусор" => "x"
    ],
    [
        "имя2" => "Jane",
        "объем2" => "400",
        "мусор" => "z"
    ]
]);

function normalizeKeys(Collection $collection, $nameKey, $volumeKey)
{
    return $collection->map(function ($item) use ($nameKey, $volumeKey) {
        return [
            'name' => $item[$nameKey] ?? null,
            'volume' => $item[$volumeKey] ?? null,
        ];
    });
}

$normalized1 = normalizeKeys($collection1, 'имя1', 'объем1');
$normalized2 = normalizeKeys($collection2, 'имя2', 'объем2');

$result = $normalized1->map(function ($item1) use ($normalized2) {
    $match = $normalized2->firstWhere('name', $item1['name']);
    
    return [
        'name' => $item1['name'],
        'volume1' => $item1['volume'],
        'volume2' => $match['volume'] ?? null,
    ];
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы