Как отобразить коллекцию с увеличивающимся внутренним массивом (для l oop) - PullRequest
1 голос
/ 19 июня 2020

Ищу элегантное решение для создания следующей коллекции. Конечные ключи не имеют значения, но мне нужно повторить сумму qty в a для l oop, а затем вывести окончательный результат.

$a = collect([
    ['id' => 1, 'qty' => 5, 'height' => 4],
    ['id' => 2, 'qty' => 5, 'height' => 2]
]);

/*
    [
        '1' => ['height' => 4],
        '2' => ['height' => 4],
        '3' => ['height' => 4],
        '4' => ['height' => 4],
        '5' => ['height' => 4],
        '6' => ['height' => 2],
        '7' => ['height' => 2],
        '8' => ['height' => 2],
        '9' => ['height' => 2],
        '10' => ['height' => 2],
    ]
*/

Идеи очень ценятся!

1 Ответ

0 голосов
/ 19 июня 2020

map с times может работать. collapse используется для выравнивания двух массивов в один. Вы можете обновить часть array_only, чтобы добавить новые ключи для результата.

return collect([['id' => 1, 'qty' => 5, 'height' => 4], ['id' => 2, 'qty' => 5, 'height' => 2]])
    ->map(function ($elt) {
        return Collection::times($elt['qty'], function ($number) use ($elt) {
            return array_only($elt, 'height');
        });
    })
    ->collapse()
    ->toArray();
...