Метод keyBy
Метод keyBy класса Arr в Laravel служит для изменения ключей элементов массива на основе значений этих элементов или результатов работы переданного замыкания. Метод возвращает новый массив, где ключами выступают указанные значения, а значениями - соответствующие элементы исходного массива. Если в процессе индексации встречаются дублирующиеся ключи, последний элемент с таким ключом перезаписывает предыдущие.
Синтаксис
<?php
use Illuminate\Support\Arr;
$array = Arr::keyBy($array, $keyBy);
?>
Метод принимает два параметра:
$array- исходный массив, который необходимо переиндексировать;$keyBy- строка (ключ элемента) или замыкание (callback), возвращающее значение для нового ключа.
Пример
Переиндексация массива по значению поля 'id':
<?php
use Illuminate\Support\Arr;
$users = [
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Jane'],
['id' => 3, 'name' => 'Doe']
];
$res = Arr::keyBy($users, 'id');
print_r($res);
?>
Результат выполнения кода:
[
1 => ['id' => 1, 'name' => 'John'],
2 => ['id' => 2, 'name' => 'Jane'],
3 => ['id' => 3, 'name' => 'Doe']
]
Пример
Использование замыкания для формирования ключа:
<?php
use Illuminate\Support\Arr;
$items = [
['title' => 'first', 'status' => 'active'],
['title' => 'second', 'status' => 'inactive'],
['title' => 'third', 'status' => 'active']
];
$res = Arr::keyBy($items, function ($item) {
return $item['title'] . '_' . $item['status'];
});
print_r($res);
?>
Результат выполнения кода:
[
'first_active' => ['title' => 'first', 'status' => 'active'],
'second_inactive' => ['title' => 'second', 'status' => 'inactive'],
'third_active' => ['title' => 'third', 'status' => 'active']
]
Пример
Обработка дублирующихся ключей (последнее значение перезаписывает предыдущие):
<?php
use Illuminate\Support\Arr;
$products = [
['category' => 'a', 'name' => 'Phone'],
['category' => 'b', 'name' => 'Laptop'],
['category' => 'a', 'name' => 'Tablet']
];
$res = Arr::keyBy($products, 'category');
print_r($res);
?>
Результат выполнения кода:
[
'a' => ['category' => 'a', 'name' => 'Tablet'],
'b' => ['category' => 'b', 'name' => 'Laptop']
]
Пример
Работа с простым индексным массивом:
<?php
use Illuminate\Support\Arr;
$numbers = ['one', 'two', 'three'];
$res = Arr::keyBy($numbers, function ($value) {
return strtoupper($value);
});
print_r($res);
?>
Результат выполнения кода:
[
'ONE' => 'one',
'TWO' => 'two',
'THREE' => 'three'
]