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,
forget
değ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
map
metodu da koleksiyonunun yeni bir örneğini döndürür, çağrılan koleksiyonu değiştirmez. Orjinal koleksiyonu değiştirmek istiyorsanıztransform
metodunu kullanabilirsiniz.