Метод mapWithKeys
Метод mapWithKeys применяется к коллекции и возвращает новую коллекцию,
где каждый элемент преобразуется в пару ключ-значение с помощью переданной
функции обратного вызова. Первым параметром передаётся замыкание,
которое принимает каждый элемент коллекции и должно вернуть ассоциативный
массив с одним элементом (ключ => значение). Если ключи повторяются,
то последнее значение перезапишет предыдущее.
Синтаксис
<?php
$collection->mapWithKeys($callback);
?>
Пример
Давайте преобразуем коллекцию пользователей в ассоциативный массив, где ключом будет id, а значением - имя пользователя:
<?php
use Illuminate\Support\Collection;
$users = collect([
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Jane'],
['id' => 3, 'name' => 'Bob']
]);
$res = $users->mapWithKeys(function ($user) {
return [$user['id'] => $user['name']];
});
print_r($res->all());
?>
Результат выполнения кода:
[
1 => "John",
2 => "Jane",
3 => "Bob"
]
Пример
Давайте создадим ассоциативный массив, где ключом будет строка, а значением - объект модели:
<?php
use Illuminate\Support\Collection;
use App\Models\Article;
$articles = Article::where('status', 'published')
->limit(3)
->get();
$res = $articles->mapWithKeys(function ($article) {
return ['article_' . $article->id => $article];
});
foreach ($res as $key => $value) {
echo $key . ": " . $value->title . "\n";
}
?>
Результат выполнения кода:
"article_1: First article"
"article_2: Second article"
"article_3: Third article"
Пример
Давайте используем mapWithKeys для преобразования коллекции чисел
в ассоциативный массив, где ключом будет число, а значением -
его квадрат:
<?php
use Illuminate\Support\Collection;
$numbers = collect([1, 2, 3, 4, 5]);
$res = $numbers->mapWithKeys(function ($number) {
return [$number => $number * $number];
});
print_r($res->all());
?>
Результат выполнения кода:
[
1 => 1,
2 => 4,
3 => 9,
4 => 16,
5 => 25
]
Пример
Давайте обработаем коллекцию товаров, создав ассоциативный массив с ключом в виде slug и значением в виде цены:
<?php
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
$products = collect([
['name' => 'Laptop', 'price' => 999, 'slug' => 'laptop-pro'],
['name' => 'Mouse', 'price' => 25, 'slug' => 'wireless-mouse'],
['name' => 'Keyboard', 'price' => 75, 'slug' => 'mechanical-keyboard']
]);
$res = $products->mapWithKeys(function ($product) {
return [$product['slug'] => $product['price']];
});
print_r($res->all());
?>
Результат выполнения кода:
[
"laptop-pro" => 999,
"wireless-mouse" => 25,
"mechanical-keyboard" => 75
]