Use mapWithKeys() to transform collections into associative dictionaries with custom keys and values in a single operation.
When converting an Eloquent collection or dataset into a keyed associative array for dropdowns, chart data, or JSON dictionaries, combining keyBy() and map() loops over the collection multiple times.
mapWithKeys() allows you to define both the new key and new value simultaneously.
Basic Key-Value Mapping
use App\Models\User;
$users = User::all();
$lookup = $users->mapWithKeys(function (User $user) {
return [$user->email => $user->name];
});
// Output:
// [
// '[email protected]' => 'Punyapal Shah',
// '[email protected]' => 'Punyapal Shah',
// ]
Formatting Option Lists for Form Selects
$options = User::all()->mapWithKeys(function (User $user) {
$label = "{$user->name} ({$user->department})";
return [$user->id => $label];
});
Multiple Key-Value Pairs from Single Items
A single item can return multiple key-value pairs if needed:
$rates = collect($plans)->mapWithKeys(function ($plan) {
return [
$plan['id'] . '_monthly' => $plan['monthly_price'],
$plan['id'] . '_annual' => $plan['annual_price'],
];
});
Summary
- Transforms items into key-value pairs in a single collection pass.
- Closure must return an associative array with
[key => value]. - Ideal for building select dropdown options and API lookup dictionaries.
Related Tips
View all tips →Combine Multiple Arrays by Index with Collection::zip()
Use zip() on Laravel Collections to merge array elements sharing matching index positions into paired sub-collections.
Flatten and Restore Nested Arrays with Collection::dot() and undot()
Use dot() to flatten nested multi-dimensional arrays into single-level dot notation maps, and undot() to reconstruct full nested structures.