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).
Break
<?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
// 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).
| Syntax | Efek |
|---|---|
break; | Keluar dari satu loop (level terdalam) |
break 2; | Keluar dari dua level loop |
break 3; | Keluar dari tiga level loop |
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
// 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
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+)
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
// ⚠️ 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";
?>
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
$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
$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
$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
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
// ❌ 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
// ⚠️ 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++;
}
?>
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
// ❌ Error! break tidak valid di luar loop atau switch
// if (true) {
// break; // Fatal error: 'break' not in loop or switch
// }
?>
Pro Tips
breakuntuk pencarian: hentikan loop begitu hasil ditemukan — hemat waktu untuk data besar.continueuntuk filter: lewati data yang tidak perlu diproses.- Hindari
break Ndan label jika bisa: pisahkan ke function dan pakaireturn— kode lebih bersih. - Di while, letakkan increment sebelum continue agar tidak terjebak infinite loop.
returndalam function lebih kuat dari break: menghentikan loop DAN seluruh function sekaligus.
Exercise
- Cari bilangan prima pertama dalam range 1-100
- Print angka 1-20, skip kelipatan 3
- Kenapa break 2 disebut "break dengan level"?
- Buat program yang mencari index pertama angka 7 di array
[5, 9, 7, 2, 7, 8]menggunakan break - Buat nested loop 3x3 yang berhenti total saat
$i + $j === 4(coba dengan break 2 dan labeled loop) - Jelaskan kenapa kode berikut infinite loop, lalu perbaiki:
<?php
$i = 0;
while ($i < 10) {
if ($i === 5) {
continue;
}
$i++;
}
?>
Summary
| Poin | Penjelasan |
|---|---|
break | Keluar dari loop seluruhnya |
continue | Lewati iterasi saat ini, lanjut iterasi berikutnya |
break 2 / continue 2 | Kontrol untuk nested loop (level) |
| Labeled loop | outer: + break outer — alternatif break N |
| Break di switch | Hanya keluar dari switch, bukan loop |
| Continue di while | Waspada: bisa melewatkan increment → infinite loop |
| Pola umum | break untuk search, continue untuk filter |
| Alternatif lebih baik | return dari function untuk logika kompleks |
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 4
Uji pemahamanmu tentang Perulangan (Loops)