Komputer unggul dalam pekerjaan berulang: memproses ratusan baris data penjualan, mencoba ulang permintaan yang gagal, atau sekadar mencetak angka satu sampai seratus. Struktur perulangan (loop) adalah cara kita menyuruh interpreter menjalankan blok kode yang sama berkali-kali, dan while adalah bentuk perulangan paling mendasar di PHP: ulangi selama kondisinya bernilai true. Pada chapter ini kita akan membahas pola counter dan akumulator, idiom klasik membaca berkas baris demi baris, risiko infinite loop yang harus Anda waspadai sejak awal, serta break sebagai pintu darurat perulangan.

Cara Kerja while #

while mengevaluasi kondisi sebelum setiap iterasi — karena itu while disebut pre-test loop. Ketika kondisi bernilai true, interpreter menjalankan isi blok satu kali, lalu kembali ke atas untuk memeriksa kondisi lagi. Ketika kondisi bernilai false — termasuk sejak pemeriksaan pertama — blok dilewati dan eksekusi berlanjut ke kode setelah perulangan.

php
<?php
$hitung = 1;

while ($hitung <= 5) {
    echo "Iterasi ke-$hitung\n";
    $hitung++;
}

Output yang Dihasilkan:

text
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-4
Iterasi ke-5

Nilai $hitung berperan sebagai counter: variabel yang menunjukkan progres perulangan. Tabel berikut melacak perubahannya dari pemeriksaan ke pemeriksaan:

Pemeriksaan keNilai $hitung$hitung <= 5Yang terjadi
11truebody dijalankan, $hitung menjadi 2
22truebody dijalankan, $hitung menjadi 3
33truebody dijalankan, $hitung menjadi 4
44truebody dijalankan, $hitung menjadi 5
55truebody dijalankan, $hitung menjadi 6
66falseperulangan berhenti, eksekusi lanjut ke bawah

Baris $hitung++; adalah kunci dari contoh ini: tanpa baris tersebut, nilai $hitung tidak pernah berubah dan perulangan tidak pernah berhenti. Setiap perulangan while yang sehat harus memiliki sesuatu yang bergerak menuju kondisi false.

Counter dan Akumulator #

Dua peran variabel muncul berulang kali dalam perulangan. Counter menjaga posisi kita di dalam proses berhitung, sedangkan akumulator mengumpulkan hasil dari tiap iterasi ke dalam satu nilai. Contoh berikut menjumlahkan angka 1 sampai 10 dengan pola keduanya.

php
<?php
$angka = 1;
$total = 0;

while ($angka <= 10) {
    $total += $angka;
    $angka++;
}

echo "Total 1 sampai 10: $total\n";

Output yang Dihasilkan:

text
Total 1 sampai 10: 55

Mari kita bedah polanya:

  1. $angka = 1 menginisialisasi counter sebelum perulangan dimulai; lupa menginisialisasi variabel akan memicu Warning: Undefined variable.
  2. $total += $angka adalah bentuk ringkas dari $total = $total + $angka — di tiap iterasi, nilai $angka saat itu ditambahkan ke akumulator.
  3. $angka++ memajukan counter; setelah sepuluh iterasi, kondisi $angka <= 10 menjadi false dan hasil akhir 55 tercetak.
  4. $total = 0 wajib ada sebelum loop — nilai awal akumulator menentukan kebenaran hasil penjumlahan.

Membaca Berkas Baris demi Baris #

while benar-benar bersinar ketika jumlah iterasi tidak diketahui di muka: memproses baris berkas sampai habis, misalnya. Fungsi fgets() membaca satu baris dari berkas yang sedang terbuka dan mengembalikan false ketika sudah tidak ada data lagi — pasangan yang sempurna untuk kondisi while.

php
<?php
$namaBerkas = __DIR__ . "/data-penjualan.txt";
file_put_contents($namaBerkas, "Budi,2\nSiti,5\nAndi,1\n");

$handle = fopen($namaBerkas, "r");

while (($baris = fgets($handle)) !== false) {
    echo "Baris terbaca: " . trim($baris) . "\n";
}

fclose($handle);
unlink($namaBerkas);

Output yang Dihasilkan:

text
Baris terbaca: Budi,2
Baris terbaca: Siti,5
Baris terbaca: Andi,1

Bagian paling penting ada di baris kondisinya, jadi mari kita bedah pelan-pelan:

  1. file_put_contents(...) membuat berkas contoh tiga baris; magic constant __DIR__ berisi direktori tempat skrip berada, sehingga berkas tercipta di samping skrip.
  2. ($baris = fgets($handle)) !== false melakukan dua hal sekaligus: fgets() membaca satu baris, hasilnya disimpan ke $baris, lalu hasil penugasan tersebut dibandingkan dengan !== false. Kurung di sekitar penugasan wajib — tanpa kurung, perbandingan !== akan dievaluasi lebih dulu karena prioritasnya lebih tinggi.
  3. trim($baris) membuang karakter baris baru (\n) di akhir tiap baris sebelum dicetak.
  4. fclose() dan unlink() menutup handle lalu menghapus berkas contoh, meninggalkan direktori bersih seperti semula.

Perhatikan bahwa tidak ada angka iterasi di mana pun — perulangan berhenti dengan sendirinya ketika fgets() kehabisan baris. Jumlah putarannya mengikuti isi berkas.

Bahaya Infinite Loop #

Kesalahan klasik pemula adalah melupakan pembaruan counter, sehingga kondisi tidak pernah menjadi false dan perulangan berjalan selamanya. Potongan berikut memuat kesalahan itu — perhatikan bahwa hanya sintaksnya yang kami periksa; jangan menjalankannya tanpa bersiap menekan Ctrl+C.

php
<?php
$hitung = 1;

while ($hitung <= 5) {
    echo "Iterasi ke-$hitung\n";
    // KESALAHAN: lupa $hitung++, kondisi tidak pernah menjadi false
}

break sebagai Pintu Darurat #

Kata kunci break menghentikan perulangan secara paksa dari dalam blok, apa pun kondisinya. Pola while (true) memanfaatkan ini: kondisinya memang selalu true, sehingga hanya break yang bisa mengakhiri perulangan setelah tujuan tertentu tercapai.

php
<?php
$nomor = 1;

while (true) {
    echo "Nomor: $nomor\n";
    if ($nomor === 3) {
        break;
    }
    $nomor++;
}

echo "Perulangan selesai.\n";

Output yang Dihasilkan:

text
Nomor: 1
Nomor: 2
Nomor: 3
Perulangan selesai.

Interpreter mencetak Nomor: 1 sampai Nomor: 3; ketika $nomor === 3 bernilai true, break dikerjakan dan eksekusi melompat ke baris setelah perulangan. Di sini kita hanya mengintip break sekilas — perilaku lengkapnya bersama continue akan kita bedah pada chapter khusus di section ini.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh di atas dalam satu program utuh yang dapat Anda unduh dan jalankan langsung.

Ringkasan #

while mengulang blok kode selama kondisi bernilai true, dengan kondisi yang diperiksa sebelum setiap iterasi. Counter dan akumulator adalah dua pola variabel andalan di dalamnya, sedangkan idiom ($baris = fgets($handle)) !== false menangani kasus jumlah iterasi yang tidak diketahui. Selalu pastikan ada yang bergerak menuju false agar tidak terjebak infinite loop, dan gunakan break sebagai pintu darurat. Kadang kita justru butuh kebalikannya — blok yang pasti berjalan minimal sekali sebelum kondisi diperiksa — dan untuk itu PHP menyediakan do-while, topik chapter berikutnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php
// contoh.php — rangkuman contoh Chapter while Loops.
// Jalankan dengan: php contoh.php

// 1. Counter sederhana
$hitung = 1;

while ($hitung <= 5) {
    echo "Iterasi ke-$hitung\n";
    $hitung++;
}

// 2. Counter dan akumulator
$angka = 1;
$total = 0;

while ($angka <= 10) {
    $total += $angka;
    $angka++;
}

echo "Total 1 sampai 10: $total\n";

// 3. Membaca berkas baris demi baris
$namaBerkas = __DIR__ . "/data-penjualan.txt";
file_put_contents($namaBerkas, "Budi,2\nSiti,5\nAndi,1\n");

$handle = fopen($namaBerkas, "r");

while (($baris = fgets($handle)) !== false) {
    echo "Baris terbaca: " . trim($baris) . "\n";
}

fclose($handle);
unlink($namaBerkas);

// 4. while (true) dengan break sebagai pintu darurat
$nomor = 1;

while (true) {
    echo "Nomor: $nomor\n";
    if ($nomor === 3) {
        break;
    }
    $nomor++;
}

echo "Perulangan selesai.\n";