- Konu sahibi
- #1
PHP foreach nedir?
PHP
foreach, bir dizideki veya nesnedeki elemanları sırayla dolaşmak için kullanılan döngüdür. Her elemanda ilgili değeri geçici bir değişkene aktarır; böylece sayaç tanımlamadan liste üzerinde işlem yapabilirsiniz. Elemanları yalnızca değerleriyle veya anahtarlarıyla birlikte dolaşabilirsiniz.Temel kullanım
En kısa biçim şöyledir:
Kod:
$meyveler = ['Elma', 'Armut', 'Muz'];
foreach ($meyveler as $meyve) {
echo $meyve . PHP_EOL;
}
Döngü her çalıştığında
$meyve değişkenine sıradaki eleman atanır. Bu örneğin çıktısı sırasıyla Elma, Armut ve Muz olur. Dizi boşsa döngünün gövdesi hiç çalışmaz.Anahtarları da almak için
anahtar => değer biçimini kullanın:
Kod:
$kullanicilar = [
'admin' => 'Ayşe',
'editor' => 'Mehmet'
];
foreach ($kullanicilar as $rol => $ad) {
echo $rol . ': ' . $ad . PHP_EOL;
}
Burada
$rol anahtarı, $ad ise o anahtarın değeridir. Anahtarların sıfırdan başlayan sayılar olması gerekmez; metin anahtarlar da kullanılabilir.Değerleri değiştirme
Aşağıdaki tamsayı dizisinde normal
foreach değişkenine yeni değer atamak özgün dizi elemanını değiştirmez. Bu ayrım, bir elemanın nesne olması durumunda o nesnenin özelliklerinin de kopyalandığı anlamına gelmez:
Kod:
$sayilar = [1, 2, 3];
foreach ($sayilar as $sayi) {
$sayi *= 2;
}
print_r($sayilar);
Sonuç yine
[1, 2, 3] olur. Özgün diziyi değiştirmek gerekiyorsa referans kullanabilirsiniz:
Kod:
foreach ($sayilar as &$sayi) {
$sayi *= 2;
}
unset($sayi);
print_r($sayilar);
Bu kez dizi
[2, 4, 6] olur. Referans döngüsünden sonra unset($sayi) çağrısı önemlidir; aksi hâlde değişken son elemana bağlı kalabilir ve sonraki işlemlerde beklenmedik değişikliklere yol açabilir. Sadece hesaplama veya çıktı gerekiyorsa referans kullanmayın.Hangi biçimi seçmelisiniz?
İhtiyaca göre karar vermek için şu ayrımı kullanın:
| İhtiyaç | Kullanım | Not |
|---|---|---|
| Yalnız değerleri okumak | foreach ($liste as $deger) | En sade ve güvenli biçim |
| Anahtar ve değeri birlikte kullanmak | foreach ($liste as $anahtar => $deger) | İlişkili diziler için uygundur |
| Özgün dizideki değerleri değiştirmek | foreach ($liste as &$deger) | Sonrasında unset($deger) kullanın |
| Belirli elemanlarda döngüyü kesmek | break veya continue | Akışı açıkça sınırlar |
Uygulanabilir örnek: koşula göre işlem yapmak
Bir listedeki yalnızca etkin kullanıcıları işlemek için döngüyü koşulla birlikte kullanabilirsiniz:
Kod:
$kullanicilar = [
['ad' => 'Ayşe', 'aktif' => true],
['ad' => 'Mehmet', 'aktif' => false],
['ad' => 'Zeynep', 'aktif' => true]
];
foreach ($kullanicilar as $kullanici) {
if (!$kullanici['aktif']) {
continue;
}
echo $kullanici['ad'] . PHP_EOL;
}
continue mevcut elemanı atlayıp sonraki elemana geçer. Belirli bir kayıt bulunduğunda tüm döngüyü bitirmek için break kullanılır. Döngüden sonra elde edilen sonucu doğrulamak istiyorsanız bir sayaç veya sonuç dizisi oluşturup yalnızca gerçekten gereken bilgileri biriktirin.Sık yapılan hatalar
- Dizi yerine
nullveya beklenmeyen bir tür üzerinde döngü kurmak: Döngüden önce verinin gerçekten dizi ya da dolaşılabilir bir nesne olduğunu kontrol edin. - Anahtarları değer sanmak:
as $degeryalnızca değeri verir; anahtar gerekiyorsaas $anahtar => $degeryazılmalıdır. - Döngü değişkenini referansla bırakmak: Referans kullanımından sonra
unsetçağırmamak, sonraki atamalarda özgün dizinin son elemanını etkileyebilir. - Dizi üzerinde dönerken yapıyı değiştirmek: Eleman ekleme, silme veya anahtarları değiştirme işlemleri dolaşmanın sonucunu karmaşıklaştırabilir. Değişiklik gerekiyorsa önce yeni bir sonuç dizisi oluşturmak genellikle daha anlaşılırdır.
- Sadece sayaç gerektiğinde gereksiz karmaşık döngü kurmak: Listedeki elemanları dolaşmak için
foreach, belirli sayıda tekrar için ise çoğu zamanfordaha uygundur.
Sık sorulan sorular
Döngü bitince değer değişkeni kendiliğinden silinir mi?
Hayır. Döngü ayrı bir değişken kapsamı oluşturmaz; en az bir tur çalıştıysa son atanan değer sonraki kodda kalabilir. Boş dizide ise yeni bir atama yapılmaz. Bu yüzden döngü sonrasında değerin oluştuğunu varsaymayın veya değişkeni başka bir amaç için örtük biçimde kullanmayın.
foreach nesneler üzerinde kullanılabilir mi?
Evet. Normal bir nesnede çağrılan kapsamdan görülebilen özellikler dolaşılır. Iterator veya IteratorAggregate gibi mekanizmalarla özel dolaşım davranışı sunan nesnelerde anahtar ve değerleri o uygulama belirler.