BAB 4: PERULANGAN (LOOPS)

4-4: Loop Control

Objectives

  • Menggunakan break untuk exit loop
  • Menggunakan continue untuk skip iteration
  • Memahami labeled loops untuk nested structures
  • Menghindari jebakan break di dalam switch
  • Memilih antara break, continue, dan return

Kenapa Perlu Loop Control?

Terkadang kamu tidak ingin menjalankan semua iterasi sampai selesai. Contohnya:

  • Kamu mencari angka 9 di sebuah array — begitu ketemu, tidak perlu lanjut mencari.
  • Kamu memproses daftar item, tapi ingin melewati item yang kosong.
  • Kamu berada di nested loop dan ingin keluar dari semua loop sekaligus.

PHP menyediakan dua kata kunci untuk ini: break (menghentikan loop) dan continue (melompat ke iterasi berikutnya).

📊 Memuat diagram…

Break

php
<?php

// Break: exit loop entirely
for ($i = 1; $i <= 10; $i++) {
    if ($i === 5) {
        echo "Ditemukan! Keluar...\n";
        break;
    }
    echo "$i\n";
}

/*
Output:
1
2
3
4
Ditemukan! Keluar...
*/

?>

Perhatikan: angka 6 sampai 10 tidak pernah dicetak. Begitu break dieksekusi, PHP langsung keluar dari loop, apapun yang terjadi setelahnya di condition.

Break dengan Level

php
<?php

// Break dari nested loop (PHP 7.3+)
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($i === 2 && $j === 2) {
            break 2;  // Exit both loops
        }
        echo "($i, $j) ";
    }
    echo "\n";
}

/*
Output:
(1, 1) (1, 2) (1, 3) 
(2, 1) (2, 2) 
*/

?>

break 2 berarti "keluar dari 2 level loop". Angka setelah break menentukan berapa banyak loop bersarang yang dilewati. Tanpa angka, break hanya keluar dari satu level (loop paling dalam).

SyntaxEfek
break;Keluar dari satu loop (level terdalam)
break 2;Keluar dari dua level loop
break 3;Keluar dari tiga level loop
⚠️Perhatian

break di dalam switch hanya keluar dari switch, bukan dari loop di sekitarnya! Jika kamu ingin keluar dari loop yang membungkus switch, gunakan break 2 atau ubah struktur kodenya.

Continue

php
<?php

// Continue: skip ke iterasi berikutnya
for ($i = 1; $i <= 5; $i++) {
    if ($i === 3) {
        echo "Skip!\n";
        continue;
    }
    echo "$i\n";
}

/*
Output:
1
2
Skip!
4
5
*/

?>

Berbeda dengan break, continue hanya melewati iterasi saat ini. Loop tetap lanjut ke iterasi berikutnya (increment tetap dijalankan).

Continue dengan Level

php
<?php

for ($i = 1; $i <= 2; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($j === 2) {
            continue 2;  // Skip ke $i berikutnya
        }
        echo "($i, $j) ";
    }
    echo "\n";
}

/*
Output:
(1, 1) (2, 1)
*/

?>

continue 2 berarti "lompat ke iterasi berikutnya dari loop 2 level ke atas". Dalam contoh ini, ketika $j === 2, seluruh iterasi $i saat itu dianggap selesai, dan $i naik ke nilai berikutnya.

Labeled Loops (PHP 7.3 – 8.2, dihapus di PHP 8.3+)

⚠️Perhatian

break dengan label non-integer (break outer;) sudah dihapus di PHP 8.3+ — akan menghasilkan fatal error: "'break' operator with non-integer operand is no longer supported". Contoh di bawah ini hanya historis (PHP 7.3–8.2); untuk PHP modern gunakan break 2 atau refactor ke function.

php
<?php
// ⚠️ TIDAK VALID di PHP 8.3+ — hanya contoh historis (PHP 7.3–8.2)
// $found = false;
//
// outer:  // Label
// for ($i = 1; $i <= 3; $i++) {
//     for ($j = 1; $j <= 3; $j++) {
//         if ($i === 2 && $j === 2) {
//             $found = true;
//             break outer;  // Exit labeled loop (tidak lagi didukung)
//         }
//     }
// }
//
// if ($found) {
//     echo "Found at (2, 2)\n";
// }

// ✅ Versi PHP 8.3+: gunakan break dengan level integer
$found = false;
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($i === 2 && $j === 2) {
            $found = true;
            break 2;  // Exit both loops
        }
    }
}

if ($found) {
    echo "Found at (2, 2)\n";
}

// ✅ Alternatif lebih clean: pisahkan ke function + return
function findInMatrix(): bool {
    for ($i = 1; $i <= 3; $i++) {
        for ($j = 1; $j <= 3; $j++) {
            if ($i === 2 && $j === 2) {
                return true;
            }
        }
    }
    return false;
}

echo findInMatrix() ? "Found at (2, 2)\n" : "Not found\n";
?>
💡Tip

Labeled loop jarang dipakai di kode nyata. Sebagian besar kasus lebih baik diselesaikan dengan break 2, atau lebih baik lagi: pisahkan logika pencarian ke dalam function dan gunakan return (dibahas di chapter 6).

Common Patterns

Search dengan Break

php
<?php

$numbers = [3, 7, 2, 9, 4, 1];
$target = 9;

$found = false;
foreach ($numbers as $num) {
    if ($num === $target) {
        $found = true;
        break;  // Berhenti mencari setelah ketemu
    }
}

echo $found ? "Ditemukan!" : "Tidak ditemukan";

?>

Tanpa break, loop tetap memproses semua elemen walau target sudah ketemu. Untuk array kecil tidak terasa, tapi untuk jutaan data ini membuang waktu.

Filter dengan Continue

php
<?php

$items = ["apple", "banana", "cherry", "", "date", ""];

foreach ($items as $item) {
    if (empty($item)) {
        continue;  // Skip empty strings
    }
    echo ucfirst($item) . "\n";
}

/*
Output:
Apple
Banana
Cherry
Date
*/

?>

Mencetak Bilangan Prima (Break + Continue)

Kombinasi kedua kontrol ini sangat berguna:

php
<?php

$primes = [];

for ($num = 2; $num <= 30; $num++) {
    $isPrime = true;

    for ($div = 2; $div < $num; $div++) {
        if ($num % $div === 0) {
            $isPrime = false;
            break;  // Cukup, sudah pasti bukan prima
        }
    }

    if (!$isPrime) {
        continue;  // Lewati bilangan non-prima
    }

    $primes[] = $num;
}

echo implode(" ", $primes) . "\n";
// Output: 2 3 5 7 11 13 17 19 23 29

?>

Validasi Input dengan Loop + Break

php
<?php

while (true) {
    $age = (int) readline("Masukkan umur: ");

    if ($age < 0 || $age > 150) {
        echo "Umur tidak valid. Coba lagi.\n";
        continue;  // Minta input ulang
    }

    echo "Umur valid: $age\n";
    break;  // Keluar dari loop
}

?>

Pola ini sering dipakai: continue untuk menolak input buruk, break untuk menerima input bagus.

Common Mistakes

Break di Dalam Switch (Jebakan Klasik)

php
<?php

// ❌ BREAK hanya keluar dari switch, bukan dari while!
$running = true;
$i = 0;

while ($running) {
    $i++;
    switch ($i) {
        case 1:
        case 2:
            echo "Iterasi $i\n";
            break;  // ← Hanya keluar dari switch
    }
    if ($i >= 3) {
        $running = false;  // Perlu cara lain untuk hentikan loop
    }
}

?>

Ini bukan bug PHP — ini perilaku yang benar. Tapi pemula sering salah mengira break di dalam switch akan menghentikan loop juga. Ingat: break hanya bekerja untuk satu struktur (switch atau loop) yang paling dekat.

Continue yang Melewatkan Increment

php
<?php

// ⚠️ Berbahaya: continue di while bisa melewati increment
$i = 0;

while ($i < 10) {
    $i++;
    if ($i % 2 === 0) {
        continue;  // Aman: increment sudah dijalankan
    }
    echo "$i ";
}
// Output: 1 3 5 7 9

// ❌ Berbahaya: increment di bawah continue
$i = 0;
while ($i < 10) {
    if ($i === 3) {
        continue;  // $i tidak pernah naik lagi! INFINITE LOOP
    }
    $i++;
}

?>
⚠️Perhatian

Di while, jika continue berada sebelum increment, increment tidak akan pernah dijalankan → infinite loop! Selalu tempatkan increment sebelum kemungkinan continue, atau gunakan for loop yang increment-nya otomatis.

Break di Luar Loop/Switch

php
<?php

// ❌ Error! break tidak valid di luar loop atau switch
// if (true) {
//     break;  // Fatal error: 'break' not in loop or switch
// }

?>

Pro Tips

  1. break untuk pencarian: hentikan loop begitu hasil ditemukan — hemat waktu untuk data besar.
  2. continue untuk filter: lewati data yang tidak perlu diproses.
  3. Hindari break N dan label jika bisa: pisahkan ke function dan pakai return — kode lebih bersih.
  4. Di while, letakkan increment sebelum continue agar tidak terjebak infinite loop.
  5. return dalam function lebih kuat dari break: menghentikan loop DAN seluruh function sekaligus.

Exercise

  1. Cari bilangan prima pertama dalam range 1-100
  2. Print angka 1-20, skip kelipatan 3
  3. Kenapa break 2 disebut "break dengan level"?
  4. Buat program yang mencari index pertama angka 7 di array [5, 9, 7, 2, 7, 8] menggunakan break
  5. Buat nested loop 3x3 yang berhenti total saat $i + $j === 4 (coba dengan break 2 dan labeled loop)
  6. Jelaskan kenapa kode berikut infinite loop, lalu perbaiki:
php
<?php
$i = 0;
while ($i < 10) {
    if ($i === 5) {
        continue;
    }
    $i++;
}
?>

Summary

PoinPenjelasan
breakKeluar dari loop seluruhnya
continueLewati iterasi saat ini, lanjut iterasi berikutnya
break 2 / continue 2Kontrol untuk nested loop (level)
Labeled loopouter: + break outer — alternatif break N
Break di switchHanya keluar dari switch, bukan loop
Continue di whileWaspada: bisa melewatkan increment → infinite loop
Pola umumbreak untuk search, continue untuk filter
Alternatif lebih baikreturn dari function untuk logika kompleks

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 4

Uji pemahamanmu tentang Perulangan (Loops)