Working with Laravel collections
I like Laravel collections very much and I favour a functional approach towards solving list problems. So I’d like to start a series where I share tips about working with collections on upcoming problems in my current projects. Lately I wanted to transform the following structure
$vendors = [
'FruitHouse' => ['Apples', 'Bananas', 'Cherries'],
'EatFresh' => ['Apples', 'Bananas', 'Berries']
];
into this “inverted” one:
$vendorsByFruits = [
'Apples' => ['FruitHouse', 'EatFresh'],
'Bananas' => ['FruitHouse', 'EatFresh'],
'Cherries' => ['FruitHouse'],
'Berries' => ['EatFresh']
];
My first approach was very traditional using a nested foreach loop:
$vendorsByFruits = [];
foreach ($vendors as $vendor => $fruits) {
foreach ($fruits as $fruit) {
$vendorsByFruits[$fruit][] = $vendor;
}
}
But I wanted to have this as a single collection transformation. So finally I came up with this solution:
$vendorsByFruits = collect($vendors)->map(function ($fruits, $vendor) {
return ['vendor' => $vendor, 'fruits' => $fruits];
})->groupBy('fruits')->map(function ($group) {
return $group->pluck('vendor');
});
I hope you’ll find this tip useful!