Поиск…
Синтаксис
- $ collection = collect (['Value1', 'Value2', 'Value3']); // Ключи по умолчанию равны 0, 1, 2, ...,
замечания
Illuminate\Support\Collection
обеспечивает свободный и удобный интерфейс для работы с массивами данных. Возможно, вы использовали их без знания, например, запросы модели, которые извлекают несколько записей, возвращают экземпляр Illuminate\Support\Collection
.
Для актуальной документации по Коллекциям вы можете найти официальную документацию здесь
Создание коллекций
Используя помощник collect()
, вы можете легко создавать новые экземпляры коллекции, передавая их в массив, такой как:
$fruits = collect(['oranges', 'peaches', 'pears']);
Если вы не хотите использовать вспомогательные функции, вы можете создать новую коллекцию с помощью класса напрямую:
$fruits = new Illuminate\Support\Collection(['oranges', 'peaches', 'pears']);
Как упоминалось в примечаниях, модели по умолчанию возвращают экземпляр Collection
, однако вы можете создавать свои собственные коллекции по мере необходимости. Если для создания не задан массив, будет создана пустая коллекция.
где()
Вы можете выбрать определенные элементы из коллекции, используя метод where()
.
$data = [
['name' => 'Taylor', 'coffee_drinker' => true],
['name' => 'Matt', 'coffee_drinker' => true]
];
$matt = collect($data)->where('name', 'Matt');
Этот бит кода выберет все элементы из коллекции, где имя «Мэтт». В этом случае возвращается только второй элемент.
гнездование
Точно так же, как и большинство методов массива в Laravel, where()
поддерживает поиск вложенных элементов. Давайте рассмотрим пример выше, добавив второй массив:
$data = [
['name' => 'Taylor', 'coffee_drinker' => ['at_work' => true, 'at_home' => true]],
['name' => 'Matt', 'coffee_drinker' => ['at_work' => true, 'at_home' => false]]
];
$coffeeDrinkerAtHome = collect($data)->where('coffee_drinker.at_home', true);
Это вернет Тейлору, поскольку он выпивает кофе дома. Как вы можете видеть, вложенность поддерживается с помощью точечной нотации.
дополнения
При создании коллекции объектов вместо массивов их можно отфильтровать, используя where()
. Затем коллекция попытается получить все необходимые свойства.
Обратите внимание: начиная с Laravel 5.3 метод where()
будет пытаться свободно сравнивать значения по умолчанию. Это означает, что при поиске (int)1
будут возвращены все записи, содержащие '1'
. Если вам не нравится это поведение, вы можете использовать метод whereStrict()
.
Использование Get to lookup value или возврат по умолчанию
Вы часто оказываетесь в ситуации, когда вам нужно найти переменную, соответствующую стоимости, и коллекции вас охватили.
В приведенном ниже примере мы получили три разных локали в массиве с соответствующим назначенным кодом вызова. Мы хотим иметь возможность предоставить локаль и взамен получить связанный код вызова. Второй параметр в get
- это параметр по умолчанию, если первый параметр не найден.
function lookupCallingCode($locale)
{
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, 44);
}
В приведенном выше примере мы можем сделать следующее
lookupCallingCode('de_DE'); // Will return 49
lookupCallingCode('sv_SE'); // Will return 44
Вы даже можете передать обратный вызов в качестве значения по умолчанию. Результат обратного вызова будет возвращен, если указанный ключ не существует:
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, function() {
return 44;
});
Использование Содержит, чтобы проверить, удовлетворяет ли коллекция определенному условию
Общей проблемой является сбор элементов, которые все должны соответствовать определенным критериям. В приведенном ниже примере мы собрали два пункта для плана диеты, и мы хотим проверить, что диета не содержит вредных продуктов питания.
// First we create a collection
$diet = collect([
['name' => 'Banana', 'calories' => '89'],
['name' => 'Chocolate', 'calories' => '546']
]);
// Then we check the collection for items with more than 100 calories
$isUnhealthy = $diet->contains(function ($i, $snack) {
return $snack["calories"] >= 100;
});
В приведенном выше случае переменная $isUnhealthy
будет установлена в true
поскольку шоколад удовлетворяет условию, и диета, таким образом, нездоровая.
Использование Pluck для извлечения определенных значений из коллекции
Вы часто окажетесь с коллекцией данных, где вас интересуют только части данных.
В приведенном ниже примере мы получили список участников на мероприятии, и мы хотим предоставить экскурсовод с простым списком имен.
// First we collect the participants
$participants = collect([
['name' => 'John', 'age' => 55],
['name' => 'Melissa', 'age' => 18],
['name' => 'Bob', 'age' => 43],
['name' => 'Sara', 'age' => 18],
]);
// Then we ask the collection to fetch all the names
$namesList = $partcipants->pluck('name')
// ['John', 'Melissa', 'Bob', 'Sara'];
Вы также можете использовать pluck
для коллекций объектов или вложенных массивов / объектов с точечной нотацией.
$users = User::all(); // Returns Eloquent Collection of all users
$usernames = $users->pluck('username'); // Collection contains only user names
$users->load('profile'); // Load a relationship for all models in collection
// Using dot notation, we can traverse nested properties
$names = $users->pluck('profile.first_name'); // Get all first names from all user profiles
Использование карты для управления каждым элементом в коллекции
Часто вам нужно изменить способ структурирования набора данных и манипулировать определенными значениями.
В приведенном ниже примере мы получили сборник книг с прилагаемой скидкой. Но у нас есть скорее список книг с ценой, которая уже уценена.
$books = [
['title' => 'The Pragmatic Programmer', 'price' => 20, 'discount' => 0.5],
['title' => 'Continuous Delivery', 'price' => 25, 'discount' => 0.1],
['title' => 'The Clean Coder', 'price' => 10, 'discount' => 0.75],
];
$discountedItems = collect($books)->map(function ($book) {
return ['title' => $book["title"], 'price' => $book["price"] * $book["discount"]];
});
//[
// ['title' => 'The Pragmatic Programmer', 'price' => 10],
// ['title' => 'Continuous Delivery', 'price' => 12.5],
// ['title' => 'The Clean Coder', 'price' => 5],
//]
Это также может быть использовано для изменения ключей, скажем , мы хотели изменить ключевое title
, чтобы name
это будет подходящим решением.
Использование суммы, avg, min или max для коллекции для статистических расчетов
Коллекции также предоставляют вам простой способ сделать простые статистические вычисления.
$books = [
['title' => 'The Pragmatic Programmer', 'price' => 20],
['title' => 'Continuous Delivery', 'price' => 30],
['title' => 'The Clean Coder', 'price' => 10],
]
$min = collect($books)->min('price'); // 10
$max = collect($books)->max('price'); // 30
$avg = collect($books)->avg('price'); // 20
$sum = collect($books)->sum('price'); // 60
Сортировка коллекции
Существует несколько способов сортировки коллекции.
Сортировать()
Метод sort
сортирует коллекцию:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
echo $sorted->values()->all();
returns : [1, 2, 3, 4, 5]
Метод sort
также позволяет передавать пользовательский обратный вызов с помощью вашего собственного алгоритма. Под капотом сортировка использует usort
php.
$collection = $collection->sort(function ($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
Сортировать по()
Метод sortBy
сортирует коллекцию по данному ключу:
$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
$sorted = $collection->sortBy('price');
echo $sorted->values()->all();
returns: [
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
['name' => 'Desk', 'price' => 200],
]
Метод sortBy
позволяет использовать формат точечной нотации для доступа к более глубокому ключу, чтобы сортировать многомерный массив.
$collection = collect([
["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
]);
$sorted = $collection->sortBy("product.price")->toArray();
return: [
["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
]
SortByDesc ()
Этот метод имеет ту же подпись, что и метод sortBy
, но сортирует коллекцию в обратном порядке.
Использование reduce ()
Метод reduce
сводит коллекцию к одному значению, передавая результат каждой итерации в последующую итерацию. См. Метод уменьшения .
Метод reduce
пересекает каждый элемент с помощью коллекции и создает новый результат для следующей итерации. Каждый результат последней итерации передается через первый параметр (в следующих примерах, как $carry
).
Этот метод может выполнять большую обработку больших наборов данных. Например, следующие примеры, мы будем использовать следующие примеры данных студента:
$student = [
['class' => 'Math', 'score' => 60],
['class' => 'English', 'score' => 61],
['class' => 'Chemistry', 'score' => 50],
['class' => 'Physics', 'score' => 49],
];
Суммарная сумма студента
$sum = collect($student)
->reduce(function($carry, $item){
return $carry + $item["score"];
}, 0);
Результат: 220
Объяснение:
-
$carry
- результат последней итерации. - Второй параметр - значение по умолчанию для $ carry в первом раунде итерации. В этом случае значение по умолчанию равно 0
Передайте студенту, если все его баллы> 50
$isPass = collect($student)
->reduce(function($carry, $item){
return $carry && $item["score"] >= 50;
}, true);
Результат: false
Объяснение:
- Значение по умолчанию $ carry равно true
- Если весь балл больше 50, результат вернет true; если они меньше 50, верните false.
Отказ студента, если оценка равна <50
$isFail = collect($student)
->reduce(function($carry, $item){
return $carry || $item["score"] < 50;
}, false);
Результат: true
Объясните:
- значение по умолчанию $ carry равно false
- если любой балл меньше 50, верните true; если все баллы превышают 50, верните false.
Возвращаемый объект с наивысшей оценкой
$highestSubject = collect($student)
->reduce(function($carry, $item){
return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
});
результат: [ "subject" => "English", "score" => 61 ]
Объясните:
В этом случае второй параметр не предоставляется.
Значение по умолчанию $ carry равно нулю, поэтому мы проверяем это в нашем условном выражении.
Использование макроса () для расширения коллекций
Функция macro()
позволяет добавлять новые функции в объекты Illuminate\Support\Collection
Использование:
Collection::macro("macro_name", function ($parameters) {
// Your macro
});
Например:
Collection::macro('uppercase', function () {
return $this->map(function ($item) {
return strtoupper($item);
});
});
collect(["hello", "world"])->uppercase();
Результат: ["HELLO", "WORLD"]
Использование синтаксиса Array
Объект Collection
реализует интерфейс ArrayAccess
и IteratorAggregate
, позволяя использовать его как массив.
Элемент доступа Access:
$collection = collect([1, 2, 3]);
$result = $collection[1];
Результат: 2
Назначить новый элемент:
$collection = collect([1, 2, 3]);
$collection[] = 4;
Результат: $collection
[1, 2, 3, 4]
Коллекция петли:
$collection = collect(["a" => "one", "b" => "two"]);
$result = "";
foreach($collection as $key => $value){
$result .= "(".$key.": ".$value.") ";
}
Результат: $result
is (a: one) (b: two)
Преобразование массива в коллекцию:
Чтобы преобразовать коллекцию в собственный PHP-массив, используйте:
$array = $collection->all();
//or
$array = $collection->toArray()
Чтобы преобразовать массив в коллекцию, используйте:
$collection = collect($array);
Использование коллекций с функциями массива
Имейте в виду, что коллекции - это обычные объекты, которые не будут правильно преобразованы при использовании функциями, явно требующими массивы, например array_map($callback)
.
Обязательно сначала конвертируйте коллекцию или, если доступно, используйте метод, предоставляемый классом Collection
: $collection->map($callback)