Giriş
Illuminate\Support\Collection sınıfı diziler çalışırken oldukça kullanışlıdır. Aşağıdaki koda bir göz atın. Diziden yeni bir koleksiyon oluşturmak için collect yardımcısını kullanıp, her element için strtoupper fonksiyonunu çalıştıracak ve boş elementleri kaldıracağız.
|
1 2 3 4 5 6 |
$collection = collect(['taylor', 'abigail', null])->map(function ($name) { return strtoupper($name); }) ->reject(function ($name) { return empty($name); }); |
Gördüğünüz gibi Collection sınıfı, metdolarını arka arkaya çalıştırmanızı sağlar. Genelde her Collection metodu tümüyle yeni bir Collection örneği döner.
Koleksiyonları Oluşturma
Yukarıda belirttildiği gibi collect yardımcısı verilen dizi için yeni bir Illuminate\Support\Collection örneği döner. Koleksiyon oluşturulması basitçe şöyledir:
|
1 |
$collection = collect([1, 2, 3]); |
Varsayılan olarak, Eloquent modellerinin koleksiyonları her zaman Collection örneğidir.
Kullanılabilir Metodlar
Bu dökümanın devamında Collection sınıfındaki her bir metodu açıklayacağız. Temel diziyi akıcı bir şekilde manipüle etmek için tüm metodlar arka aryaya kullanılabilir. Dahası, hemen hemen bütün metodlar yeni bir Collection örneği dönerler. Bu orjinal koleksiyonun orjinal kopyasını saklamanızı sağlar.
Kullanım örneği görmeniz için bu tablodaki herhangi bir metodu seçebilirsiniz.
all
chunk
collapse
contains
count
diff
each
every
filter
first
flatten
flip
forget
forPage
get
groupBy
has
implode
intersect
isEmpty
keyBy
keys
last
map
merge
pluck
pop
prepend
pull
push
put
random
reduce
reject
reverse
search
shift
shuffle
slice
sort
sortBy
sortByDesc
splice
sum
take
toArray
toJson
transform
unique
values
where
whereLoose
zip
Metod Listesi
all()
all metodu tüm diziyi döner.
|
1 2 3 |
collect([1, 2, 3])->all(); // [1, 2, 3] |
chunk()
chunk metodu koleksiyonu çoklu parçalara böler.
|
1 2 3 4 5 6 7 |
$collection = collect([1, 2, 3, 4, 5, 6, 7]); $chunks = $collection->chunk(4); $chunks->toArray(); // [[1, 2, 3, 4], [5, 6, 7]] |
Bu metod özellikle Bootstrap gibi ızgara sistemlerde çalışırken görünümlerde kullanışlıdır. Bir Eloquent model koleksiyonunuz olduğunu ve ızgarada göstermek istediğinizi düşünün.
|
1 2 3 4 5 6 7 |
@foreach ($products->chunk(3) as $chunk) <div class="row"> @foreach ($chunk as $product) <div class="col-xs-4">{{ $product->name }}</div> @endforeach </div> @endforeach |
collapse()
collapse metodu koleksion dizilerini tek bir düz koleksiyon haline getirir.
|
1 2 3 4 5 6 7 |
$collection = collect([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); $collapsed = $collection->collapse(); $collapsed->all(); // [1, 2, 3, 4, 5, 6, 7, 8, 9] |
contains()
contains metodu verilen elemanın dizi içinde olup olmadığını belirler.
|
1 2 3 4 5 6 7 8 9 |
$collection = collect(['name' => 'Desk', 'price' => 100]); $collection->contains('Desk'); // true $collection->contains('New York'); // false |
Metodu key/value çiftini de geçirebilirsiniz.
|
1 2 3 4 5 6 7 8 |
$collection = collect([ ['product' => 'Desk', 'price' => 200], ['product' => 'Chair', 'price' => 100], ]); $collection->contains('product', 'Bookcase'); // false |
Son olarak, kendi doğrulama tersiniz için metoda geri çağırım da geçirebilirsiniz.
|
1 2 3 4 5 6 7 |
$collection = collect([1, 2, 3, 4, 5]); $collection->contains(function ($key, $value) { return $value > 5; }); // false |
count()
count metodu koleksiyondaki toplam elemanların sayısını yöner.
|
1 2 3 4 5 |
$collection = collect([1, 2, 3, 4]); $collection->count(); // 4 |
diff()
diff metodu kolleksiyonla başka bir koleksiyon veya düz PHP dizisini karşılaştırır.
|
1 2 3 4 5 6 7 |
$collection = collect([1, 2, 3, 4, 5]); $diff = $collection->diff([2, 4, 6, 8]); $diff->all(); // [1, 3, 5] |
each()
each metodu verilen geri çağrımı koleksiyondaki öğeleri tekrarlar.
|
1 2 3 |
$collection = $collection->each(function ($item, $key) { // }); |
every()
every metodu, her n’inci öğeden oluşan yeni bir koleksiyon oluşturur.
|
1 2 3 4 5 |
$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']); $collection->every(4); // ['a', 'e'] |
İkinci argüman olarak isteğe bağlı uzatma geçirebilirsiniz.
|
1 2 3 |
$collection->every(4, 1); // ['b', 'f'] |
filter()
filter metodu, verilen geribildirimle filtrelenen elemenalardan yalnızca teste uyan elemanları filtreler.
|
1 2 3 4 5 6 7 8 9 |
$collection = collect([1, 2, 3, 4]); $filtered = $collection->filter(function ($item) { return $item > 2; }); $filtered->all(); // [3, 4] |
filter metodunun tersi için reject metoduna bakabilirsiniz.
first()
first metodu, koleksiyondaki teste uyan ilk elemanı döndürür.
|
1 2 3 4 5 |
collect([1, 2, 3, 4])->first(function ($key, $value) { return $value > 2; }); // 3 |
Ayrıca first metodunu koleksiyonunun ilk elemanınını almak için argümansız da çağırabilirsiniz. Koleksiyon boş ise null döndürülür:
|
1 2 3 |
collect([1, 2, 3, 4])->first(); // 1 |
flatten()
flatten metodu, çok boyutlu koleksiyonu tek boyuyluya çevirir.
|
1 2 3 4 5 6 7 |
$collection = collect(['name' => 'taylor', 'languages' => ['php', 'javascript']]); $flattened = $collection->flatten(); $flattened->all(); // ['taylor', 'php', 'javascript']; |
flip()
flip metodu, koleksiyonun anahtarları ile karşılık gelen değerlerini yerdeğiştirir.
|
1 2 3 4 5 6 7 |
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']); $flipped = $collection->flip(); $flipped->all(); // ['taylor' => 'name', 'laravel' => 'framework'] |
forget()
forget metodu, anahtarı verilen elementi koleksiyondan kaldırır.
|
1 2 3 4 5 6 7 |
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']); $collection->forget('name'); $collection->all(); // [framework' => 'laravel'] |
Diğer bir çok koleksiyon metodlarından farklı olarak,
forgetdeğiştirilen yeni bir koleksiyon dönmez; çağrıldığı koleksiyonu değiştirir.
forPage()
forPage sayfa numarası verilen elemanları gösterecek yeni bir koleksiyon döndürür.
|
1 2 3 4 5 6 7 |
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]); $chunk = $collection->forPage(2, 3); $chunk->all(); // [4, 5, 6] |
Bu metod sırasıyla sayfa numarası ve sayfada gösterilecek eleman sayısı verilir.
get()
get metodu verilen anahtardaki elemanı döner. Anahtar yok ise null döndürülür.
|
1 2 3 4 5 |
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']); $value = $collection->get('name'); // taylor |
Opsiyonel olarak varsayılan değeri ikinci argüman olarak verebilirsiniz.
|
1 2 3 4 5 |
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']); $value = $collection->get('foo', 'default-value'); // default-value |
Varsayılan değer olarak geribildirim de verebilirsiniz. Verilen anahtar yoksa geribildirim sonucu döndürülecek.
|
1 2 3 4 5 |
$collection->get('email', function () { return 'default-value'; }); // default-value |
groupBy()
groupBy metodu, anahtarı verilen koleksiyon elemanlarını gruplar.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$collection = collect([ ['account_id' => 'account-x10', 'product' => 'Chair'], ['account_id' => 'account-x10', 'product' => 'Bookcase'], ['account_id' => 'account-x11', 'product' => 'Desk'], ]); $grouped = $collection->groupBy('account_id'); $grouped->toArray(); /* [ 'account-x10' => [ ['account_id' => 'account-x10', 'product' => 'Chair'], ['account_id' => 'account-x10', 'product' => 'Bookcase'], ], 'account-x11' => [ ['account_id' => 'account-x11', 'product' => 'Desk'], ], ] */ |
Anahtar olarak string geçirmeye ek olarak, geri bildirim de geçirebilirsiniz.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$grouped = $collection->groupBy(function ($item, $key) { return substr($item['account_id'], -3); }); $grouped->toArray(); /* [ 'x10' => [ ['account_id' => 'account-x10', 'product' => 'Chair'], ['account_id' => 'account-x10', 'product' => 'Bookcase'], ], 'x11' => [ ['account_id' => 'account-x11', 'product' => 'Desk'], ], ] */ |
has()
has metodu, verilen anahtarın koleksiyonda olup olmadığını kontrol eder.
|
1 2 3 4 5 |
$collection = collect(['account_id' => 1, 'product' => 'Desk']); $collection->has('email'); // false |
implode()
implode metodu, koleksiyonun elemanlarını birleştirir.
|
1 2 3 4 5 6 7 8 |
$collection = collect([ ['account_id' => 1, 'product' => 'Desk'], ['account_id' => 2, 'product' => 'Chair'], ]); $collection->implode('product', ', '); // Desk, Chair |
intersect()
intersect metodu, verilen dizi veya koleksiyonda olmayan değerleri kaldırır.
|
1 2 3 4 5 6 7 |
$collection = collect(['Desk', 'Sofa', 'Chair']); $intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']); $intersect->all(); // [0 => 'Desk', 2 => 'Chair'] |
Gördüğünüz gibi, sonuç koleksiyonu koleksiyonunun orjinal anahtarlarını saklayacaktır.
isEmpty()
isEmpty metodu, koleksiyon boş ise true, aksi halde false döndürür.
|
1 2 3 |
collect([])->isEmpty(); // true |
keyBy()
Verilen anahtarla koleksiyonu tekrar düzenler.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$collection = collect([ ['product_id' => 'prod-100', 'name' => 'desk'], ['product_id' => 'prod-200', 'name' => 'chair'], ]); $keyed = $collection->keyBy('product_id'); $keyed->all(); /* [ 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'], 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'], ] */ |
Eğer birçok eleman aynı anaytara sahipse, yalnızca sonuncu olan yeni koleksiyonda yer alacaktır.
Kendi geri bildirimizi de geçireblirsiniz.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
$keyed = $collection->keyBy(function ($item) { return strtoupper($item['product_id']); }); $keyed->all(); /* [ 'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'], 'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'], ] */ |
last()
last metodu, koleksyondaki teste uyan son elemanı döndürür
|
1 2 3 4 5 |
collect([1, 2, 3, 4])->last(function ($key, $value) { return $value < 3; }); // 2 |
Ayrıca last metodunu koleksiyonunun son elemanınını almak için argümansız da çağırabilirsiniz. Koleksiyon boş ise null döndürülür:
|
1 2 3 |
collect([1, 2, 3, 4])->last(); // 4 |
map()
map metodu, koleksiyon içinde ilerleyerek her değeri verilen geribildirime aktarır.
|
1 2 3 4 5 6 7 8 9 |
$collection = collect([1, 2, 3, 4, 5]); $multiplied = $collection->map(function ($item, $key) { return $item * 2; }); $multiplied->all(); // [2, 4, 6, 8, 10] |
Not: Çoğu koleksiyon metodu gibi
mapmetodu da koleksiyonunun yeni bir örneğini döndürür, çağrılan koleksiyonu değiştirmez. Orjinal koleksiyonu değiştirmek istiyorsanıztransformmetodunu kullanabilirsiniz.