Yazılım

PHP Döngüleri: for, while ve foreach ile Tekrarlayan İşlemler

15 Şubat 2026 10 dk okuma 4 görüntülenme

Hoş Geldiniz, Kahveler Hazır mı?

Merhaba dostum, hoş geldin. Eğer serinin ilk yazısını okuduysan, değişkenlerin o renkli dünyasına ve "eğer şu olursa bunu yap" dediğimiz if-else karar yapılarına artık aşinasın demektir. O yazıda temelleri attık, harcı kardık. Şimdi ise o tuğlaları tek tek elle koymak yerine, bu işi otomatiğe bağlayacak vincin, yani döngülerin kumanda koluna geçeceğiz.

Şöyle bir geriye dönüp 2005 yılına, kodlamaya ilk başladığım o uykusuz gecelere gidiyorum. O zamanlar bir şeyi ekrana 10 kere yazdırmam gerektiğinde, utanarak söylüyorum ama, echo satırını kopyalayıp 10 kere alt alta yapıştırırdım. "Çalışıyor mu? Çalışıyor" mantığı... Ama sonra bir proje geldi ve benden 1000 tane veriyi işlemem istendi. İşte o an, kopyala-yapıştırın bir çözüm olmadığını, yazılımın asıl gücünün "tekrar eden işleri bilgisayara yıkmak" olduğunu anladım.

Bilgisayarlar aptaldır ama çok hızlıdırlar. Biz insanlar ise zekiyiz ama tekrar eden işlerden çabuk sıkılırız. İşte döngüler (Loops), bu iki tarafın en iyi özelliklerini birleştirir. Bugün seninle, Pixel Lab® mutfağında en çok kullandığımız, hayat kurtaran o yapıları; for, while ve dizilerin efendisi foreach'i inceleyeceğiz. Arkanıza yaslanın, başlıyoruz.

1. for Döngüsü: Sayısı Belli İşlerin Emekçisi

Yazılımda en temel kural şudur: Eğer bir işlemin kaç kez tekrarlanacağını baştan biliyorsan, adresin for döngüsüdür. Bunu bir basketbol antrenmanı gibi düşün. Koç sana "Çizgiye geç ve tam 10 tane serbest atış yap" dedi. Sayı belli, hedef belli. 11 değil, 9 değil, tam 10.

Teknik olarak for döngüsü üç ana parçadan oluşur ve hepsi tek bir satırda tanımlanır. Bu yüzden derli topludur, okunması kolaydır. Gel kodun içine bakalım:


<?php
// 1'den 10'a kadar olan sayıları ekrana yazdıralım

// Yapı: for (Başlangıç; Koşul; Artış Miktarı)
for ($i = 1; $i <= 10; $i++) {
    echo "Şu anki sayı: " . $i . "<br>";
}
?>

Burada neler dönüyor, bir bakalım:

  • Başlangıç ($i = 1): Sayacımızı kuruyoruz. Genelde programcılıkta "iterator" kelimesinin baş harfi olan $i kullanılır. Alışkanlık diyelim.
  • Koşul ($i <= 10): Döngü her turda bu soruyu sorar: "Şu anki sayı 10'dan küçük veya eşit mi?" Cevap "Evet" ise çalışmaya devam eder.
  • Artış ($i++): Her turun sonunda sayacı bir artırır. Eğer bunu yazmazsan, $i hep 1 kalır ve bilgisayarın sonsuza kadar 1 sayısını yazar (buna birazdan geleceğiz, tehlikeli sular).

Ben genelde veritabanından sayfalama yaparken veya belirli bir tarih aralığını listelerken for kullanmayı tercih ediyorum. Basit, net ve kararlı.

2. while Döngüsü: "Yeter Diyene Kadar Devam"

Bazen hayatta işlerin ne zaman biteceğini bilemezsin. Sadece bir koşulun varlığını bilirsin. while döngüsü tam olarak budur. Sayı vermezsin, sadece bir şart koşarsın.

Bunu benzin istasyonundaki duruma benzetiyorum. Deponun kaç litre alacağını tam olarak bilmiyor olabilirsin. Pompanın mantığı şudur: "Depo dolmadığı sürece benzin akıtmaya devam et." Ne zaman depo dolar (koşul sağlanmaz), o zaman işlem durur.


<?php
$depoDoluluk = 0;
$depoKapasitesi = 50;

// Depo 50 litre olana kadar döngü çalışır
while ($depoDoluluk < $depoKapasitesi) {
    $depoDoluluk += 10; // Her turda 10 litre ekle
    echo "Depo dolduruluyor... Şu anki seviye: $depoDoluluk litre <br>";
}

echo "İşlem tamam! Depo fullendi.";
?>

Bir Dost Uyarısı: Sonsuz Döngü Faciası

Bak burası çok önemli. while kullanırken en çok yapılan hata, döngüyü sonlandıracak değişikliği yapmayı unutmaktır. Gençliğimde, henüz tarayıcıların bu kadar akıllı olmadığı dönemlerde, bir while döngüsü yazdım ve içeride değişkeni artırmayı unuttum. Sonuç? Bilgisayar kilitlendi, fan sesi uçak motoruna döndü ve o günkü kodlarımı kaybetmek zorunda kaldım. Eğer yukarıdaki örnekte $depoDoluluk += 10; satırını yazmasaydım, depo hiç dolmayacak ve döngü sonsuza kadar ekrana yazı basmaya çalışacaktı. Aman dikkat!

3. do-while Döngüsü: Önce Yap, Sonra Sor

Bu döngü tipi, while'ın biraz daha gözü kara kardeşidir. while döngüsünde koşul baştan sağlanmazsa kod hiç çalışmaz. Ama do-while der ki: "Kardeşim sen bir kere yap, sonra duruma bakarız."

Bunu yemek tadımına benzetebiliriz. Bir yemeği sevip sevmediğini anlamak için (koşul), en az bir kere tadına bakman (eylem) gerekir. Önce yersin, sonra "Devam edeyim mi?" diye sorarsın.


<?php
$sayi = 100;

do {
    echo "Bu mesaj en az bir kez görünecek. Sayı: $sayi <br>";
    $sayi++;
} while ($sayi < 5); 
// Dikkat et: Sayı 100 olduğu için koşul (5'ten küçük olma) aslında baştan yanlış.
// Ama do-while önce işlemi yaptığı için mesajı bir kez görürsün.
?>

Dürüst olayım, 15 yılı aşkın kariyerimde do-while'ı toplasan 5-10 projede kullanmışımdır. Ama çantanızda bulunması gereken bir tornavida gibidir; nadiren lazım olur ama lazım olduğunda da hayat kurtarır.

4. foreach Döngüsü: Dizilerin Efendisi

Geldik benim favorime... Eğer modern web geliştirme yapacaksan, veritabanlarıyla uğraşacaksan, senin en yakın dostun foreach olacak. Adından da anlaşılacağı gibi (for each - her biri için), bir topluluğun içindeki her elemanı tek tek ele alır.

Doğa tutkunu olduğum için bunu kamp çantası hazırlamaya benzetiyorum. Bir listen var: Çadır, uyku tulumu, bıçak, fener. Bu listeyi (diziyi) eline alıyorsun ve her bir eşya için "Bunu çantaya koy" işlemini yapıyorsun. Listenin kaç elemanlı olduğu önemli değil, bitene kadar devam eder.

Basit Kullanım


<?php
$kampMalzemeleri = ["Çadır", "Uyku Tulumu", "Kamp Bıçağı", "Matara"];

foreach ($kampMalzemeleri as $malzeme) {
    // Her turda sıradaki eleman $malzeme değişkenine atanır
    echo "Çantaya eklendi: $malzeme <br>";
}
?>

Anahtar ve Değer (Key => Value) Kullanımı

Bazen sadece malzemenin adı yetmez, sırasını veya etiketini de bilmek istersin. İşte o zaman $key => $value yapısı devreye girer. Bu yapı, Pixel Lab® projelerinde veri işlerken bizim elimiz ayağımızdır.


<?php
$ozellikler = [
    "Ad" => "Buğrahan",
    "Meslek" => "Yazılım Geliştirici",
    "Hobi" => "Doğa ve Kamp",
    "Deneyim" => "18 Yıl"
];

foreach ($ozellikler as $etiket => $deger) {
    echo "<strong>$etiket:</strong> $deger <br>";
}
?>

Gördüğün gibi, foreach dizinin sınırlarını kendi bilir. "Acaba dizi bitti mi?" diye kontrol etmene gerek kalmaz. Bu yüzden dizilerle çalışırken en güvenli limandır.

5. Akışı Kontrol Etmek: break ve continue

Döngüler bazen fazla "düz" çalışabilir. Bizim ise araya girip müdahale etmemiz gereken durumlar olur. İşte burada iki komut devreye giriyor: break (kır/çık) ve continue (devam et/pas geç).

break: Acil Çıkış Kapısı

Döngü normalde bitmemiş olsa bile, aradığını bulduysan döngüyü orada kesip atmanı sağlar. Mesela, samanlıkta iğne arıyorsun. İğneyi bulduktan sonra samanı aramaya devam etmezsin, değil mi?


<?php
for ($i = 1; $i <= 100; $i++) {
    if ($i == 15) {
        echo "Aranan sayı 15 bulundu! Döngüden çıkılıyor.";
        break; // Döngüyü anında öldürür
    }
}
?>

continue: Bu Turu Pas Geç

Döngüyü bitirmek istemiyorsun ama o anki turda işlem yapmak da istemiyorsun. Sadece o elemanı atlayıp bir sonrakine geçmek istiyorsun.


<?php
// 1'den 5'e kadar olan sayıları yaz ama 3'ü atla
for ($i = 1; $i <= 5; $i++) {
    if ($i == 3) {
        continue; // Aşağıdaki kodları çalıştırma, direkt bir sonraki tura geç
    }
    echo "Sayı: $i <br>";
}
// Çıktı: 1, 2, 4, 5 (3 yok)
?>

İç İçe Döngüler: Labirentin İçine Girmek

Bazen tek bir döngü yetmez. Bir döngünün içinde başka bir döngü çalıştırmanız gerekir. Bunu bir saatin çalışması gibi düşünebilirsin. Yelkovan (içteki döngü) tam bir tur attığında, akrep (dıştaki döngü) sadece bir adım ilerler.

Özellikle çarpım tablosu yaparken veya karmaşık veri yapılarını (JSON verileri gibi) çözerken iç içe döngüler (Nested Loops) kullanırız. Ama dikkatli ol dostum, iç içe döngüler işlemciyi yorar. 3-4 katmanlı döngüler yazıyorsan, durup "Ben nerede yanlış yapıyorum?" diye düşünme vaktidir.


<?php
// Basit bir çarpım tablosu örneği
for ($i = 1; $i <= 5; $i++) { // Dış döngü
    echo "<strong>$i'ler:</strong> ";
    for ($j = 1; $j <= 5; $j++) { // İç döngü
        echo ($i * $j) . " ";
    }
    echo "<br>"; // Bir satır aşağı in
}
?>

Kodun Performansı ve Temizliği Üzerine Bir Not

Yazının sonlarına yaklaşırken sana bir "kıdemli abi" tavsiyesi vereyim. Döngüler güçlüdür ama dikkatsiz kullanıldığında sunucunu ağlatabilir. Özellikle for döngüsünün koşul kısmında, her turda tekrar hesaplanacak ağır fonksiyonlar kullanmaktan kaçın. Örneğin, bir dizinin eleman sayısını her turda count($dizi) ile saydırmak yerine, bunu döngüden önce bir değişkene atamak performansı artırır. Küçük projelerde fark etmezsin ama milyonlarca veriyle uğraşırken bana dua edersin.

Sıra Sende: Küçük Bir Meydan Okuma

Okumakla yazılımcı olunmaz, yazmak gerekir. Şimdi senden küçük bir ödev istiyorum. Bilgisayarını aç ve şunları dene:

  1. for döngüsü kullanarak 1'den 100'e kadar olan sayılar içinde sadece çift sayıları ekrana yazdır.
  2. Bir dizi oluştur, içine en sevdiğin 5 filmi yaz. Sonra foreach ile bunları listele ama 3. filme geldiğinde döngüden break ile çık.

Bu alıştırmalar sana basit gelebilir ama parmak hafızası dediğimiz şey böyle oluşuyor. Hata yapmaktan korkma. O siyah ekranın üzerindeki beyaz/renkli yazılar, hata yapa yapa, düzelte düzelte anlam kazanıyor.

Döngülerle veri işlemeyi öğrendik. Peki, yazdığımız bu kod parçalarını tekrar tekrar kullanmak istersek ne yapacağız? Her seferinde baştan mı yazacağız? Tabii ki hayır. Bir sonraki yazımda, kodun yapı taşları olan, işimizi paketleyip rafa kaldırmamızı sağlayan Fonksiyonlar (Functions) konusuna gireceğiz. O zamana kadar, kodların temiz, döngülerin sonsuz olmasın (şaka şaka, sonsuz döngüden uzak dur).

Doğayla ve kodla kal.

Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yazın!

Yorum Yaz

E-posta adresiniz yayınlanmayacaktır.
0 / 2000