Szukaj…
Składnia
- $ collection = collect ([„Value1”, „Value2”, „Value3”]); // Klucze domyślnie to 0, 1, 2, ...,
Uwagi
Illuminate\Support\Collection
zapewnia płynny i wygodny interfejs do zarządzania tablicami danych. Być może z nich korzystałeś, nie wiedząc, na przykład zapytania modelowe, które pobierają wiele rekordów, zwracają instancję Illuminate\Support\Collection
.
Aby uzyskać aktualną dokumentację dotyczącą kolekcji, możesz znaleźć oficjalną dokumentację tutaj
Tworzenie kolekcji
Za pomocą pomocnika collect()
możesz łatwo tworzyć nowe instancje kolekcji, przekazując tablicę, taką jak:
$fruits = collect(['oranges', 'peaches', 'pears']);
Jeśli nie chcesz korzystać z funkcji pomocniczych, możesz utworzyć nową kolekcję bezpośrednio za pomocą klasy:
$fruits = new Illuminate\Support\Collection(['oranges', 'peaches', 'pears']);
Jak wspomniano w uwagach, Modele domyślnie zwracają instancję Collection
, jednak w razie potrzeby możesz tworzyć własne kolekcje. Jeśli podczas tworzenia nie zostanie określona żadna tablica, zostanie utworzona pusta kolekcja.
gdzie()
Możesz wybrać określone elementy z kolekcji za pomocą metody where()
.
$data = [
['name' => 'Taylor', 'coffee_drinker' => true],
['name' => 'Matt', 'coffee_drinker' => true]
];
$matt = collect($data)->where('name', 'Matt');
Ten fragment kodu wybierze wszystkie elementy z kolekcji, której nazwa to „Matt”. W takim przypadku zwracany jest tylko drugi element.
Zagnieżdżanie
Podobnie jak większość metod tablicowych w Laravel, where()
obsługuje również wyszukiwanie zagnieżdżonych elementów. Rozszerzmy powyższy przykład, dodając drugą tablicę:
$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);
To zwróci tylko Taylora, który pije kawę w domu. Jak widać, zagnieżdżanie obsługiwane jest za pomocą notacji kropkowej.
Wzbogacenie
Podczas tworzenia kolekcji obiektów zamiast tablic można je również filtrować za pomocą where()
. Kolekcja spróbuje następnie uzyskać wszystkie pożądane właściwości.
Należy pamiętać, że od wersji Laravel 5.3 metoda where()
będzie próbowała domyślnie luźno porównywać wartości. Oznacza to, że podczas wyszukiwania (int)1
zwracane będą również wszystkie wpisy zawierające '1'
. Jeśli nie podoba ci się to zachowanie, możesz użyć metody whereStrict()
.
Za pomocą Pobierz, aby wyszukać wartość lub przywrócić wartość domyślną
Często znajdujesz się w sytuacji, w której musisz znaleźć zmienne odpowiadające wartości, a kolekcje cię objęły.
W poniższym przykładzie mamy trzy różne ustawienia narodowe w tablicy z przypisanym odpowiednim kodem wywołującym. Chcemy być w stanie podać ustawienia regionalne, aw zamian uzyskać powiązany kod wywołujący. Drugi parametr w get
jest parametrem domyślnym, jeśli pierwszy parametr nie zostanie znaleziony.
function lookupCallingCode($locale)
{
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, 44);
}
W powyższym przykładzie możemy wykonać następujące czynności
lookupCallingCode('de_DE'); // Will return 49
lookupCallingCode('sv_SE'); // Will return 44
Możesz nawet przekazać oddzwonienie jako wartość domyślną. Wynik wywołania zwrotnego zostanie zwrócony, jeśli określony klucz nie istnieje:
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, function() {
return 44;
});
Używanie Zawiera, aby sprawdzić, czy kolekcja spełnia określony warunek
Częstym problemem jest posiadanie kolekcji przedmiotów, które wszystkie muszą spełniać określone kryteria. W poniższym przykładzie zebraliśmy dwa elementy do planu diety i chcemy sprawdzić, czy dieta nie zawiera niezdrowego jedzenia.
// 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;
});
W powyższym przypadku zmienna $isUnhealthy
zostanie ustawiona na true
ponieważ czekolada spełnia warunek, a dieta jest niezdrowa.
Używanie narzędzia Pluck do wyodrębnienia niektórych wartości z kolekcji
Często znajdziesz się w zbiorze danych, w którym interesują Cię tylko części danych.
W poniższym przykładzie otrzymaliśmy listę uczestników wydarzenia i chcemy przedstawić przewodnikowi prostą listę nazwisk.
// 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'];
Możesz także użyć pluck
do kolekcji obiektów lub zagnieżdżonych tablic / obiektów z notacją kropkową.
$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
Używanie mapy do manipulowania każdym elementem w kolekcji
Często trzeba zmienić sposób struktury zestawu danych i manipulować pewnymi wartościami.
W poniższym przykładzie otrzymaliśmy zbiór książek z dołączoną kwotą rabatu. Ale raczej mamy listę książek, których cena jest już obniżona.
$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],
//]
Można to również wykorzystać do zmiany kluczy, powiedzmy, że chcieliśmy zmienić title
klucza, aby name
to byłoby odpowiednie rozwiązanie.
Wykorzystanie sumy, średniej, minimalnej lub maksymalnej w zbiorze do obliczeń statystycznych
Kolekcje zapewniają również łatwy sposób wykonywania prostych obliczeń statystycznych.
$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
Sortowanie kolekcji
Istnieje kilka różnych sposobów sortowania kolekcji.
Sortować()
Metoda sort
sortuje kolekcję:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
echo $sorted->values()->all();
returns : [1, 2, 3, 4, 5]
Metoda sort
pozwala również na przekazanie niestandardowego wywołania zwrotnego z własnym algorytmem. Pod maską sort używa php's usort
.
$collection = $collection->sort(function ($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
Sortuj według()
Metoda sortBy
sortuje kolekcję według podanego klucza:
$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],
]
Metoda sortBy
pozwala na użycie formatu notacji kropkowej w celu uzyskania dostępu do głębszego klucza w celu posortowania tablicy wielowymiarowej.
$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 ()
Ta metoda ma taki sam podpis jak metoda sortBy
, ale posortuje kolekcję w odwrotnej kolejności.
Korzystanie z funkcji zmniejszania ()
reduce
sposób zmniejsza gromadzenie się do pojedynczej wartości, przechodząc wynik każdej iteracji w kolejnej iteracji. Zobacz metodę zmniejszania .
Metoda reduce
zapętla każdy element z kolekcją i generuje nowy wynik do następnej iteracji. Każdy wynik z ostatniej iteracji jest przekazywany przez pierwszy parametr (w poniższych przykładach jako $carry
).
Ta metoda może wykonać wiele operacji na dużych zestawach danych. Na przykład następujące przykłady wykorzystamy następujące przykładowe dane studenta:
$student = [
['class' => 'Math', 'score' => 60],
['class' => 'English', 'score' => 61],
['class' => 'Chemistry', 'score' => 50],
['class' => 'Physics', 'score' => 49],
];
Suma łącznego wyniku studenta
$sum = collect($student)
->reduce(function($carry, $item){
return $carry + $item["score"];
}, 0);
Wynik: 220
Wyjaśnienie:
-
$carry
jest wynikiem ostatniej iteracji. - Drugi parametr jest wartością domyślną dla $ carry w pierwszej rundzie iteracji. W takim przypadku wartością domyślną jest 0
Zdać ucznia, jeśli wszystkie jego wyniki są> = 50
$isPass = collect($student)
->reduce(function($carry, $item){
return $carry && $item["score"] >= 50;
}, true);
Wynik: false
Wyjaśnienie:
- Domyślna wartość $ carry to true
- Jeśli wynik jest większy niż 50, wynik zwróci wartość true; jeśli mniej niż 50, zwróć false.
Niepowodzenie ucznia, jeśli jakikolwiek wynik jest <50
$isFail = collect($student)
->reduce(function($carry, $item){
return $carry || $item["score"] < 50;
}, false);
Wynik: true
Wyjaśnić:
- domyślna wartość $ carry to false
- jeśli jakikolwiek wynik jest mniejszy niż 50, zwróć true; jeśli wszystkie wyniki są większe niż 50, zwróć false.
Zwróć temat z najwyższym wynikiem
$highestSubject = collect($student)
->reduce(function($carry, $item){
return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
});
wynik: [ "subject" => "English", "score" => 61 ]
Wyjaśnić:
W tym przypadku nie podano drugiego parametru.
Domyślna wartość $ carry wynosi null, dlatego sprawdzamy to w naszym warunkowym.
Używanie makro () do rozszerzania kolekcji
Funkcja macro()
pozwala dodawać nowe funkcje do obiektów Illuminate\Support\Collection
Stosowanie:
Collection::macro("macro_name", function ($parameters) {
// Your macro
});
Na przykład:
Collection::macro('uppercase', function () {
return $this->map(function ($item) {
return strtoupper($item);
});
});
collect(["hello", "world"])->uppercase();
Wynik: ["HELLO", "WORLD"]
Korzystanie ze składni macierzy
Obiekt Collection
implementuje interfejs ArrayAccess
i IteratorAggregate
, dzięki czemu można go używać jak tablicę.
Dostęp do elementu kolekcji:
$collection = collect([1, 2, 3]);
$result = $collection[1];
Wynik: 2
Przypisz nowy element:
$collection = collect([1, 2, 3]);
$collection[] = 4;
Wynik: $collection
wynosi [1, 2, 3, 4]
Kolekcja Loop:
$collection = collect(["a" => "one", "b" => "two"]);
$result = "";
foreach($collection as $key => $value){
$result .= "(".$key.": ".$value.") ";
}
Wynik: $result
jest (a: one) (b: two)
Konwersja tablicy do kolekcji:
Aby przekonwertować kolekcję na natywną tablicę PHP, użyj:
$array = $collection->all();
//or
$array = $collection->toArray()
Aby przekonwertować tablicę na kolekcję, użyj:
$collection = collect($array);
Używanie kolekcji z funkcjami macierzy
Należy pamiętać, że kolekcje są normalnymi obiektami, które nie zostaną poprawnie przekonwertowane, gdy zostaną użyte przez funkcje wyraźnie wymagające tablic, takie jak array_map($callback)
.
Najpierw należy przekonwertować kolekcję lub, jeśli jest dostępna, użyć metody podanej przez klasę Collection
: $collection->map($callback)