Suche…
Syntax
- $ collection = collect (['Value1', 'Value2', 'Value3']); // Schlüssel sind standardmäßig 0, 1, 2, ...,
Bemerkungen
Illuminate\Support\Collection
bietet eine fließende und bequeme Schnittstelle für den Umgang mit Datenfeldern. Möglicherweise haben Sie diese verwendet, ohne es zu wissen. Beispielabfragen, die mehrere Datensätze abrufen, geben eine Instanz von Illuminate\Support\Collection
.
Für aktuelle Dokumentation auf Sammlungen können Sie die offizielle Dokumentation finden hier
Sammlungen erstellen
Mit dem collect()
Helper können Sie leicht neue Collection-Instanzen erstellen, indem Sie ein Array wie das folgende übergeben:
$fruits = collect(['oranges', 'peaches', 'pears']);
Wenn Sie keine Hilfsfunktionen verwenden möchten, können Sie eine neue Collection direkt mit der Klasse erstellen:
$fruits = new Illuminate\Support\Collection(['oranges', 'peaches', 'pears']);
Wie in den Anmerkungen erwähnt, geben Models standardmäßig eine Collection
Instanz zurück. Sie können jedoch nach Bedarf Ihre eigenen Sammlungen erstellen. Wenn bei der Erstellung kein Array angegeben wird, wird eine leere Collection erstellt.
woher()
Sie können bestimmte Elemente aus einer Sammlung auswählen, indem Sie die where()
Methode verwenden.
$data = [
['name' => 'Taylor', 'coffee_drinker' => true],
['name' => 'Matt', 'coffee_drinker' => true]
];
$matt = collect($data)->where('name', 'Matt');
Dieser Code wählt alle Elemente aus der Sammlung aus, bei denen der Name 'Matt' lautet. In diesem Fall wird nur der zweite Artikel zurückgegeben.
Verschachtelung
Genau wie bei den meisten Array-Methoden in Laravel unterstützt where()
die Suche nach verschachtelten Elementen. Lassen Sie uns das obige Beispiel erweitern, indem Sie ein zweites Array hinzufügen:
$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);
Dies wird nur Taylor zurückgeben, da er zu Hause Kaffee trinkt. Wie Sie sehen, wird die Verschachtelung mit der Punktnotation unterstützt.
Ergänzungen
Wenn Sie eine Sammlung von Objekten anstelle von Arrays erstellen, können diese auch mit where()
gefiltert werden. Die Collection versucht dann, alle gewünschten Eigenschaften zu erhalten.
Bitte beachten Sie, dass die where()
-Methode seit Laravel 5.3 versucht, die Werte standardmäßig lose zu vergleichen. Das bedeutet, wenn Sie nach (int)1
suchen, werden auch alle Einträge zurückgegeben, die '1'
enthalten. Wenn Sie dieses Verhalten nicht mögen, können Sie die whereStrict()
-Methode verwenden.
Verwenden von Get zum Nachschlagen von Werten oder zum Rücksetzen des Standardwerts
Sie befinden sich häufig in einer Situation, in der Sie Variablen mit entsprechenden Werten suchen müssen und Sammlungen erfasst wurden.
Im folgenden Beispiel haben wir drei verschiedene Gebietsschemas in einem Array mit einem entsprechenden Anrufcode zugewiesen. Wir möchten in der Lage sein, ein Gebietsschema bereitzustellen und erhalten im Gegenzug den zugehörigen aufrufenden Code. Der zweite Parameter in get
ist ein Standardparameter, wenn der erste Parameter nicht gefunden wird.
function lookupCallingCode($locale)
{
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, 44);
}
Im obigen Beispiel können wir Folgendes tun
lookupCallingCode('de_DE'); // Will return 49
lookupCallingCode('sv_SE'); // Will return 44
Sie können sogar einen Rückruf als Standardwert übergeben. Das Ergebnis des Rückrufs wird zurückgegeben, wenn der angegebene Schlüssel nicht vorhanden ist:
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, function() {
return 44;
});
Verwenden von Enthält, um zu überprüfen, ob eine Sammlung bestimmte Bedingungen erfüllt
Ein häufiges Problem ist das Sammeln von Elementen, die alle bestimmte Kriterien erfüllen müssen. Im folgenden Beispiel haben wir zwei Elemente für einen Diätplan zusammengestellt und möchten überprüfen, ob die Diät keine ungesunde Nahrung enthält.
// 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;
});
In diesem Fall wird die Variable $isUnhealthy
auf true
gesetzt, wenn Schokolade die Bedingung erfüllt, und die Diät ist daher ungesund.
Verwenden von Pluck, um bestimmte Werte aus einer Sammlung zu extrahieren
Sie werden häufig eine Sammlung von Daten erhalten, bei denen Sie nur an Teilen der Daten interessiert sind.
Im Beispiel unten haben wir eine Teilnehmerliste bei einer Veranstaltung erhalten und möchten dem Reiseleiter eine einfache Liste mit Namen geben.
// 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'];
Sie können das pluck
für Sammlungen von Objekten oder verschachtelten Arrays / Objekten mit Punktnotation verwenden.
$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
Mit Map können Sie jedes Element in einer Sammlung bearbeiten
Häufig müssen Sie die Struktur eines Datensatzes ändern und bestimmte Werte bearbeiten.
Im Beispiel unten haben wir eine Sammlung von Büchern mit angehängter Rabattmenge erhalten. Vielmehr haben wir eine Liste von Büchern, deren Preis bereits ermäßigt ist.
$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],
//]
Dies könnte auch die Schlüssel verwendet werden , um zu ändern, lassen Sie uns sagen , dass wir den Schlüssel ändern wollte title
name
dies eine geeignete Lösung wäre.
Verwenden Sie sum, avg, min oder max für eine Sammlung für statistische Berechnungen
Sammlungen bieten Ihnen auch eine einfache Möglichkeit, einfache statistische Berechnungen durchzuführen.
$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
Eine Sammlung sortieren
Es gibt verschiedene Möglichkeiten, eine Sammlung zu sortieren.
Sortieren()
Die sort
sortiert die Sammlung:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
echo $sorted->values()->all();
returns : [1, 2, 3, 4, 5]
Die sort
ermöglicht auch das Übergeben eines benutzerdefinierten Rückrufs mit Ihrem eigenen Algorithmus. Unter der Haube sortieren Sie PHP- usort
.
$collection = $collection->sort(function ($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
Sortiere nach()
Die sortBy
Methode sortiert die Auflistung nach dem angegebenen Schlüssel:
$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],
]
Die sortBy
Methode ermöglicht die Verwendung des Punktnotierungsformats für den Zugriff auf tiefere Schlüssel, um ein mehrdimensionales Array zu sortieren.
$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 ()
Diese Methode hat dieselbe Signatur wie die sortBy
Methode, sortiert die Auflistung jedoch in umgekehrter Reihenfolge.
Verwenden Sie reduzieren ()
Die reduce
Methode reduziert die Sammlung auf einen einzelnen Wert und übergibt das Ergebnis jeder Iteration an die nachfolgende Iteration. Bitte siehe Methode reduzieren .
Die reduce
durchläuft jedes Element mit einer Auflistung und erzeugt ein neues Ergebnis für die nächste Iteration. Jedes Ergebnis der letzten Iteration wird durch den ersten Parameter übergeben (in den folgenden Beispielen als $carry
).
Diese Methode kann viele Datenmengen für große Datenmengen verarbeiten. Für die folgenden Beispiele verwenden wir die folgenden Beispielstudiendaten:
$student = [
['class' => 'Math', 'score' => 60],
['class' => 'English', 'score' => 61],
['class' => 'Chemistry', 'score' => 50],
['class' => 'Physics', 'score' => 49],
];
Summe der Gesamtpunktzahl des Schülers
$sum = collect($student)
->reduce(function($carry, $item){
return $carry + $item["score"];
}, 0);
Ergebnis: 220
Erläuterung:
-
$carry
ist das Ergebnis der letzten Iteration. - Der zweite Parameter ist der Standardwert für den $ carry in der ersten Iterationsrunde. In diesem Fall ist der Standardwert 0
Übergeben Sie einen Schüler, wenn alle Ergebnisse> = 50 sind
$isPass = collect($student)
->reduce(function($carry, $item){
return $carry && $item["score"] >= 50;
}, true);
Ergebnis: false
Erläuterung:
- Der Standardwert von $ carry ist wahr
- Wenn alle Punkte größer als 50 sind, wird das Ergebnis als wahr zurückgegeben. Wenn weniger als 50, wird false zurückgegeben.
Versagen Sie einen Schüler, wenn eine Punktzahl <50 ist
$isFail = collect($student)
->reduce(function($carry, $item){
return $carry || $item["score"] < 50;
}, false);
Ergebnis: true
Erklären:
- Der Standardwert von $ carry ist false
- Wenn eine Bewertung unter 50 liegt, geben Sie true zurück. Sind alle Werte größer als 50, wird false zurückgegeben.
Betreff mit der höchsten Punktzahl zurückgeben
$highestSubject = collect($student)
->reduce(function($carry, $item){
return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
});
Ergebnis: [ "subject" => "English", "score" => 61 ]
Erklären:
Der zweite Parameter wird in diesem Fall nicht bereitgestellt.
Der Standardwert von $ carry ist null, daher überprüfen wir dies in unserer Bedingung.
Verwenden von macro () zum Erweitern von Sammlungen
Mit der Funktion macro()
können Sie den Illuminate\Support\Collection
Objekten neue Funktionen hinzufügen
Verwendungszweck:
Collection::macro("macro_name", function ($parameters) {
// Your macro
});
Zum Beispiel:
Collection::macro('uppercase', function () {
return $this->map(function ($item) {
return strtoupper($item);
});
});
collect(["hello", "world"])->uppercase();
Ergebnis: ["HELLO", "WORLD"]
Verwenden der Array-Syntax
Das Collection
Objekt implementiert die ArrayAccess
und IteratorAggregate
Schnittstelle, sodass diese wie ein Array verwendet werden kann.
Auf Sammlungselement zugreifen:
$collection = collect([1, 2, 3]);
$result = $collection[1];
Ergebnis: 2
Neues Element zuweisen:
$collection = collect([1, 2, 3]);
$collection[] = 4;
Ergebnis: $collection
ist [1, 2, 3, 4]
Loop-Sammlung:
$collection = collect(["a" => "one", "b" => "two"]);
$result = "";
foreach($collection as $key => $value){
$result .= "(".$key.": ".$value.") ";
}
Ergebnis: $result
ist (a: one) (b: two)
Konvertierung von Array in Collection:
Um eine Collection in ein natives PHP-Array zu konvertieren, verwenden Sie:
$array = $collection->all();
//or
$array = $collection->toArray()
Verwenden Sie zum Konvertieren eines Arrays in eine Sammlung Folgendes:
$collection = collect($array);
Verwenden von Sammlungen mit Array-Funktionen
Bitte beachten Sie, dass Sammlungen normale Objekte sind, die nicht ordnungsgemäß konvertiert werden, wenn sie von Funktionen verwendet werden, die explizit Arrays erfordern, wie array_map($callback)
.
Stellen Sie sicher, dass Sie die Auflistung zuerst konvertieren, oder verwenden Sie stattdessen die von der Collection
Klasse bereitgestellte Methode: $collection->map($callback)