Zoeken…
Syntaxis
- $ collection = collect (['Value1', 'Value2', 'Value3']); // Toetsen standaard op 0, 1, 2, ...,
Opmerkingen
Illuminate\Support\Collection
biedt een vloeiende en handige interface om met gegevensreeksen om te gaan. Mogelijk hebt u deze zonder het te weten gebruikt, bijvoorbeeld Modelquery's die meerdere records ophalen, retourneren een exemplaar van Illuminate\Support\Collection
.
Voor up-to-date documentatie van collecties kunt u de officiële documentatie te vinden hier
Collecties maken
Met behulp van de collect()
-helper kunt u eenvoudig nieuwe collectie-instanties maken door een array door te geven, zoals:
$fruits = collect(['oranges', 'peaches', 'pears']);
Als je geen helperfuncties wilt gebruiken, kun je een nieuwe collectie maken met de klasse rechtstreeks:
$fruits = new Illuminate\Support\Collection(['oranges', 'peaches', 'pears']);
Zoals vermeld in de opmerkingen, retourneren modellen standaard een instantie Collection
, maar het staat u vrij om uw eigen collecties te maken als dat nodig is. Als er bij het maken geen array is opgegeven, wordt een lege verzameling gemaakt.
waar()
U kunt bepaalde items uit een verzameling selecteren met de methode where()
.
$data = [
['name' => 'Taylor', 'coffee_drinker' => true],
['name' => 'Matt', 'coffee_drinker' => true]
];
$matt = collect($data)->where('name', 'Matt');
Dit stukje code selecteert alle items uit de verzameling waarvan de naam 'Matt' is. In dit geval wordt alleen het tweede item geretourneerd.
nesting
Net als de meeste matrixmethoden in Laravel, where()
ook het zoeken naar geneste elementen ondersteunt. Laten we het bovenstaande voorbeeld uitbreiden door een tweede array toe te voegen:
$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);
Dit zal alleen Taylor teruggeven, omdat hij thuis koffie drinkt. Zoals u ziet, wordt nesten ondersteund met behulp van de puntnotatie.
toevoegingen
Wanneer u een verzameling objecten maakt in plaats van arrays, kunnen deze ook worden gefilterd met where()
. De collectie probeert dan alle gewenste eigenschappen te ontvangen.
Houd er rekening mee dat sinds Laravel 5.3 de methode where()
de waarden standaard losjes probeert te vergelijken. Dat betekent dat bij het zoeken naar (int)1
, alle items met '1'
ook worden geretourneerd. Als je dat gedrag niet leuk vindt, kun je de methode whereStrict()
gebruiken.
Get gebruiken om waarde op te zoeken of standaard te retourneren
Je komt vaak in een situatie terecht waarin je een overeenkomstige waarde voor variabelen moet vinden, en collecties bieden dekking.
In het onderstaande voorbeeld hebben we drie verschillende landinstellingen in een array waaraan een bijbehorende belcode is toegewezen. We willen een landinstelling kunnen bieden en in ruil daarvoor de bijbehorende belcode ontvangen. De tweede parameter in get
is een standaardparameter als de eerste parameter niet wordt gevonden.
function lookupCallingCode($locale)
{
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, 44);
}
In het bovenstaande voorbeeld kunnen we het volgende doen
lookupCallingCode('de_DE'); // Will return 49
lookupCallingCode('sv_SE'); // Will return 44
U kunt zelfs een callback als standaardwaarde doorgeven. Het resultaat van de terugbelopdracht wordt geretourneerd als de opgegeven sleutel niet bestaat:
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, function() {
return 44;
});
Bevat Bevatten om te controleren of een verzameling aan bepaalde voorwaarden voldoet
Een veel voorkomend probleem is het hebben van een verzameling items die allemaal aan bepaalde criteria moeten voldoen. In het onderstaande voorbeeld hebben we twee items verzameld voor een dieetplan en we willen controleren of het dieet geen ongezond voedsel bevat.
// 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 het bovenstaande geval wordt de variabele $isUnhealthy
op true
omdat Chocolade aan de voorwaarde voldoet en het dieet dus ongezond is.
Pluck gebruiken om bepaalde waarden uit een verzameling te extraheren
U zult vaak merken dat u een verzameling gegevens hebt waarin u alleen geïnteresseerd bent in delen van de gegevens.
In het onderstaande voorbeeld hebben we een lijst met deelnemers aan een evenement en we willen de gids voorzien van een eenvoudige lijst met namen.
// 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'];
U kunt ook pluck
voor verzamelingen objecten of geneste arrays / objecten met puntnotatie.
$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
Kaart gebruiken om elk element in een verzameling te manipuleren
Vaak moet u de manier wijzigen waarop een set gegevens is gestructureerd en bepaalde waarden manipuleren.
In het onderstaande voorbeeld hebben we een verzameling boeken met een bijgevoegd kortingsbedrag. Maar we hebben veel liever een lijst met boeken met een prijs die al is verdisconteerd.
$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],
//]
Dit kan ook worden gebruikt om de toetsen te veranderen, laten we zeggen dat we wilden om de toets title
te name
zou een passende oplossing zijn.
Som, gemiddelde, min of max voor een verzameling gebruiken voor statistische berekeningen
Collecties bieden u ook een gemakkelijke manier om eenvoudige statistische berekeningen uit te voeren.
$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
Een verzameling sorteren
Er zijn verschillende manieren om een verzameling te sorteren.
Soort()
De sort
sorteert de verzameling:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
echo $sorted->values()->all();
returns : [1, 2, 3, 4, 5]
Met de sort
kunt u ook een aangepaste callback doorgeven met uw eigen algoritme. Onder de motorkap gebruikt php's usort
.
$collection = $collection->sort(function ($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
Sorteer op()
De sortBy
methode sorteert de verzameling op de gegeven sleutel:
$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],
]
Met de sortBy
methode kunt u de sortBy
gebruiken om toegang te krijgen tot een diepere sleutel om een multidimensionale array te sorteren.
$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 ()
Deze methode heeft dezelfde handtekening als de sortBy
methode, maar sorteert de verzameling in de omgekeerde volgorde.
Verkleinen ()
De reduce
reduceert de verzameling tot een enkele waarde en geeft het resultaat van elke iteratie door aan de volgende iteratie. Zie methode verkleinen .
De reduce
doorloopt elk item met een verzameling en produceert een nieuw resultaat voor de volgende iteratie. Elk resultaat van de laatste iteratie wordt doorgegeven door de eerste parameter (in de volgende voorbeelden, als $carry
).
Deze methode kan veel verwerken op grote gegevenssets. Bijvoorbeeld de volgende voorbeelden, we zullen de volgende voorbeeldstudentgegevens gebruiken:
$student = [
['class' => 'Math', 'score' => 60],
['class' => 'English', 'score' => 61],
['class' => 'Chemistry', 'score' => 50],
['class' => 'Physics', 'score' => 49],
];
Som de totale score van de student
$sum = collect($student)
->reduce(function($carry, $item){
return $carry + $item["score"];
}, 0);
Resultaat: 220
Uitleg:
-
$carry
is het resultaat van de laatste iteratie. - De tweede parameter is de standaardwaarde voor de $ carry in de eerste iteratieronde. In dit geval is de standaardwaarde 0
Passeer een student als al zijn scores> = 50 zijn
$isPass = collect($student)
->reduce(function($carry, $item){
return $carry && $item["score"] >= 50;
}, true);
Resultaat: niet false
Uitleg:
- Standaardwaarde van $ carry is waar
- Als alle scores hoger zijn dan 50, zal het resultaat waar zijn; indien minder dan 50, retourneer onwaar.
Mislukken van een student als een score <50 is
$isFail = collect($student)
->reduce(function($carry, $item){
return $carry || $item["score"] < 50;
}, false);
Resultaat: true
Leg uit:
- de standaardwaarde van $ carry is onwaar
- als een score lager is dan 50, geef true terug; als alle scores groter zijn dan 50, retourneer false.
Retourneer het onderwerp met de hoogste score
$highestSubject = collect($student)
->reduce(function($carry, $item){
return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
});
resultaat: [ "subject" => "English", "score" => 61 ]
Leg uit:
De tweede parameter wordt in dit geval niet verstrekt.
De standaardwaarde van $ carry is nul, dus we controleren dat in onze voorwaardelijke.
Macro () gebruiken om collecties uit te breiden
Met de functie macro()
kunt u nieuwe functionaliteit toevoegen aan Illuminate\Support\Collection
objecten
Gebruik:
Collection::macro("macro_name", function ($parameters) {
// Your macro
});
Bijvoorbeeld:
Collection::macro('uppercase', function () {
return $this->map(function ($item) {
return strtoupper($item);
});
});
collect(["hello", "world"])->uppercase();
Resultaat: ["HELLO", "WORLD"]
Array Syntax gebruiken
Het object Collection
implementeert de interface ArrayAccess
en IteratorAggregate
, zodat deze als een array kan worden gebruikt.
Toegang verzamelelement:
$collection = collect([1, 2, 3]);
$result = $collection[1];
Resultaat: 2
Wijs een nieuw element toe:
$collection = collect([1, 2, 3]);
$collection[] = 4;
Resultaat: $collection
is [1, 2, 3, 4]
Loop collectie:
$collection = collect(["a" => "one", "b" => "two"]);
$result = "";
foreach($collection as $key => $value){
$result .= "(".$key.": ".$value.") ";
}
Resultaat: $result
is (a: one) (b: two)
Conversie van array naar collectie:
Om een verzameling naar een native PHP-array te converteren, gebruikt u:
$array = $collection->all();
//or
$array = $collection->toArray()
Gebruik het volgende om een array om te zetten in een verzameling:
$collection = collect($array);
Collecties gebruiken met matrixfuncties
Houd er rekening mee dat collecties normale objecten zijn die niet correct worden geconverteerd wanneer ze worden gebruikt door functies die expliciet arrays vereisen, zoals array_map($callback)
.
Zorg ervoor dat u de verzameling eerst converteert, of, indien beschikbaar, in plaats daarvan de methode gebruikt die door de klasse Collection
wordt geboden: $collection->map($callback)