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.

5.3

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)



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow