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.

5.3

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)



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow