Loop yang kita bangun sejauh ini selalu berjalan sampai kondisi bernilai false atau sampai seluruh elemen habis. Pada praktiknya kita sering membutuhkan kendali yang lebih halus: hentikan pencarian begitu hasil ditemukan, lewati data yang tidak valid, atau keluar dari beberapa tingkat loop sekaligus. Dua kata kunci — break dan continue — adalah alat PHP untuk kebutuhan tersebut. Pada chapter ini kita mempelajari cara kerjanya, tingkat lompatannya, perbedaan perilakunya di berbagai jenis loop, serta jebakan continue di dalam switch yang sering menjebak pemula.

Menghentikan Perulangan dengan break #

break menghentikan struktur perulangan yang menaunginya secara langsung. Sisa iterasi tidak dijalankan sama sekali, dan eksekusi melompat ke kode yang berada tepat setelah loop. Pola ini standar untuk pencarian: begitu data ditemukan, melanjutkan penelusuran hanya membuang waktu:

php
<?php
$peserta = ["Budi", "Siti", "", "Andi", "Rina"];

foreach ($peserta as $nama) {
    if ($nama === "") {
        echo "Data tidak valid, proses dihentikan.\n";
        break;
    }
    echo "Memproses peserta: $nama\n";
}

Output yang Dihasilkan:

text
Memproses peserta: Budi
Memproses peserta: Siti
Data tidak valid, proses dihentikan.

Mari kita ikuti jalannya program: Budi dan Siti diproses normal, lalu loop tiba di elemen ketiga yang berisi string kosong. Kondisi $nama === "" bernilai true, pesan peringatan dicetak, dan break menghentikan foreach secara total. "Andi" dan "Rina" tidak pernah tersentuh meskipun keduanya data yang sah — itulah konsekuensi berhenti total, dan kita memilihnya karena satu data rusak mengindikasikan seluruh berkas bermasalah.

break dengan Tingkat Lompatan #

Di dalam loop bersarang, break tanpa angka hanya menghentikan loop terdalam yang menaunginya. Untuk keluar dari beberapa tingkat sekaligus, break menerima sebuah angka level: break 2 keluar dari dua loop, break 3 dari tiga loop, dan seterusnya. Perhatikan contoh pencarian nilai di dalam matriks dua dimensi:

php
<?php
$matriks = [
    [3, 7, 1],
    [8, 2, 9],
    [4, 6, 5],
];
$cari = 2;

foreach ($matriks as $nomorBaris => $baris) {
    foreach ($baris as $kolom => $nilai) {
        if ($nilai === $cari) {
            echo "Angka $cari ada di baris $nomorBaris, kolom $kolom.\n";
            break 2;
        }
    }
}

echo "Pencarian selesai.\n";

Output yang Dihasilkan:

text
Angka 2 ada di baris 1, kolom 1.
Pencarian selesai.

Angka 2 ditemukan di baris 1 kolom 1. Tanpa angka level, break hanya akan menghentikan loop foreach bagian dalam, lalu loop luar lanjut memeriksa baris ketiga — sia-sia, karena hasil sudah didapat. break 2 menghentikan kedua loop sekaligus, dan eksekusi jatuh ke echo "Pencarian selesai.\n"; di baris setelah loop luar. Angka pada break tidak boleh melebihi jumlah loop yang menaunginya; PHP menolak break 3 di dalam dua loop dengan fatal error, jadi hitung tingkatnya dengan hati-hati.

Melewati Iterasi dengan continue #

continue lebih halus daripada break: sisa blok iterasi saat ini dilewati, tetapi loop tetap hidup dan langsung maju ke iterasi berikutnya. Gunakan continue ketika sebagian elemen tidak layak diproses namun sisanya tetap harus ditangani:

php
<?php
$nilaiSiswa = [
    "Budi" => 80,
    "Siti" => 45,
    "Andi" => 92,
    "Rina" => 30,
];

foreach ($nilaiSiswa as $nama => $nilai) {
    if ($nilai < 50) {
        continue;
    }
    echo "$nama lulus dengan nilai $nilai\n";
}

Output yang Dihasilkan:

text
Budi lulus dengan nilai 80
Andi lulus dengan nilai 92

Ketika foreach bertemu nilai Siti (45), kondisi $nilai < 50 bernilai true dan continue melewatkan echo untuk iterasi tersebut. Loop kemudian maju ke Andi tanpa menghentikan apa pun, sehingga hanya nilai Budi dan Andi yang tercetak. Kontrasnya tegas: break mematikan loop, continue hanya membuang satu putaran.

Perilaku continue pada for, foreach, dan while #

Kunci memahami continue adalah menjawab satu pertanyaan: siapa yang menggerakkan kemajuan loop? Pada for, ekspresi ketiga ($i++) dievaluasi di akhir setiap iterasi — termasuk iterasi yang diwarnai continue — sehingga counter tetap maju. Pada foreach, kemajuan otomatis karena elemen diambil satu per satu dari array. Perhatikan kedua perilaku tersebut sekaligus:

php
<?php
for ($i = 1; $i <= 5; $i++) {
    if ($i % 2 === 0) {
        continue;
    }
    echo "Ganjil: $i\n";
}

$nomor = 0;
while ($nomor < 5) {
    $nomor++;
    if ($nomor % 2 === 0) {
        continue;
    }
    echo "Dari while: $nomor\n";
}

Output yang Dihasilkan:

text
Ganjil: 1
Ganjil: 3
Ganjil: 5
Dari while: 1
Dari while: 3
Dari while: 5

Kedua loop menghasilkan pola ganjil yang sama. Perhatikan letak $nomor++ pada versi while: kenaikan dilakukan sebelum pemeriksaan continue, sehingga semua jalur iterasi menaikkan counter. while tidak memiliki ekspresi kemajuan bawaan seperti for — kemajuan sepenuhnya tanggung jawab kode di dalam blok, dan inilah sumber jebakan berikut:

php
<?php
$counter = 0;

while ($counter < 5) {
    if ($counter % 2 === 0) {
        continue;
    }
    $counter++;
    echo "Ganjil: $counter\n";
}

Jebakan continue di Dalam switch #

PHP memperlakukan switch sebagai struktur perulangan untuk keperluan continue — warisan sejarah yang mengejutkan banyak pemula. Akibatnya, continue tanpa angka di dalam switch berperilaku seperti break: hanya keluar dari switch-nya, bukan melanjutkan loop di luarnya. Untuk benar-benar melanjutkan loop, tulis continue 2:

php
<?php
$pembeli = [
    ["nama" => "Budi", "tipe" => "member"],
    ["nama" => "Siti", "tipe" => "guest"],
    ["nama" => "Andi", "tipe" => "member"],
];

foreach ($pembeli as $orang) {
    switch ($orang["tipe"]) {
        case "guest":
            continue 2;
        default:
            echo "Member diproses: {$orang['nama']}\n";
    }
}

Output yang Dihasilkan:

text
Member diproses: Budi
Member diproses: Andi

Ketika foreach bertemu Siti yang berstatus guest, continue 2 melompat melewati sisa blok loop — termasuk case default — dan langsung memproses Andi. Sekarang bandingkan dengan versi bermasalah yang memakai continue polos:

php
<?php
$pembeli = [
    ["nama" => "Budi", "tipe" => "member"],
    ["nama" => "Siti", "tipe" => "guest"],
];

foreach ($pembeli as $orang) {
    switch ($orang["tipe"]) {
        case "guest":
            continue;
        default:
            echo "Member diproses: {$orang['nama']}\n";
    }
    echo "Baris ini tetap berjalan untuk {$orang['nama']}\n";
}

Jika dijalankan, contoh kedua mencetak peringatan Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Perilakunya juga berubah: untuk Siti, continue hanya keluar dari switch, sehingga baris echo di bawah switch tetap tereksekusi — padahal niat kita melewati seluruh iterasi. Dengan continue 2, Siti tidak menghasilkan output apa pun karena seluruh sisa blok loop dilewati.

Alternatif yang Lebih Jelas: Pindahkan Logika ke Function #

break 2 dan continue 2 bekerja dengan baik, tetapi pembaca kode tetap harus menghitung tingkat loop di kepala untuk memahami artinya. Alternatif yang sering lebih jernih adalah membungkus loop ke dalam sebuah function: return menghentikan seluruh proses kapan pun dibutuhkan, dan continue polos kembali berarti apa adanya karena switch ikut hilang. Kita akan membahas function secara tuntas pada Section Fungsi — untuk sekarang, cukup perhatikan alurnya:

php
<?php
function prosesPembeli(array $daftarPembeli): void
{
    foreach ($daftarPembeli as $orang) {
        if ($orang["nama"] === "") {
            return;
        }
        if ($orang["tipe"] !== "member") {
            continue;
        }
        echo "Member diproses: {$orang['nama']}\n";
    }
}

prosesPembeli([
    ["nama" => "Budi", "tipe" => "member"],
    ["nama" => "Siti", "tipe" => "guest"],
    ["nama" => "", "tipe" => "member"],
    ["nama" => "Andi", "tipe" => "member"],
]);

Output yang Dihasilkan:

text
Member diproses: Budi

Siti dilewati karena bukan member, lalu return berhenti total ketika nama kosong ditemukan — Andi tidak pernah diproses. Perhatikan bahwa tidak ada satu pun angka level di kode ini: return menyatakan “berhenti semuanya” tanpa perlu menghitung loop, dan continue bekerja bebas dari jebakan switch karena validasi tipe kini memakai if biasa. Inilah contoh kecil bagaimana struktur kode yang baik mengurangi kebutuhan akan kendali alur yang rumit — tema yang akan kita perdalam pada chapter Merancang Control Flow .

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh di atas dalam satu program utuh yang dapat Anda unduh dan jalankan langsung dengan php contoh.php. Dua potongan sengaja tidak disertakan di dalamnya: contoh perulangan tak berujung dan contoh continue polos di dalam switch, karena keduanya adalah kode bermasalah yang hanya layak dibaca, bukan dijalankan.

Ringkasan #

break menghentikan loop dan menerima angka level untuk keluar dari loop bersarang sekaligus; continue melewatkan sisa iterasi dan melanjutkan loop. Pada for dan foreach, kemajuan loop tetap terjaga otomatis, tetapi while menuntut kenaikan counter di semua jalur agar tidak berubah menjadi perulangan tak berujung. Di dalam switch, continue polos berubah makna menjadi seperti break, sehingga continue 2 wajib ditulis eksplisit. Ketika PHP bercampur dengan HTML, kurung kurawal justru menjadi sumber kebingungan — PHP menyediakan sintaks alternatif untuk mengatasinya, 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 break dan continue dari chapter "break dan continue".
// Jalankan dengan: php contoh.php

echo "== break menghentikan loop ==\n";
$peserta = ["Budi", "Siti", "", "Andi", "Rina"];

foreach ($peserta as $nama) {
    if ($nama === "") {
        echo "Data tidak valid, proses dihentikan.\n";
        break;
    }
    echo "Memproses peserta: $nama\n";
}

echo "\n== break 2 untuk loop bersarang ==\n";
$matriks = [
    [3, 7, 1],
    [8, 2, 9],
    [4, 6, 5],
];
$cari = 2;

foreach ($matriks as $nomorBaris => $baris) {
    foreach ($baris as $kolom => $nilai) {
        if ($nilai === $cari) {
            echo "Angka $cari ada di baris $nomorBaris, kolom $kolom.\n";
            break 2;
        }
    }
}

echo "Pencarian selesai.\n";

echo "\n== continue melewati iterasi ==\n";
$nilaiSiswa = [
    "Budi" => 80,
    "Siti" => 45,
    "Andi" => 92,
    "Rina" => 30,
];

foreach ($nilaiSiswa as $nama => $nilai) {
    if ($nilai < 50) {
        continue;
    }
    echo "$nama lulus dengan nilai $nilai\n";
}

echo "\n== continue pada for dan while ==\n";
for ($i = 1; $i <= 5; $i++) {
    if ($i % 2 === 0) {
        continue;
    }
    echo "Ganjil: $i\n";
}

$nomor = 0;
while ($nomor < 5) {
    $nomor++;
    if ($nomor % 2 === 0) {
        continue;
    }
    echo "Dari while: $nomor\n";
}

echo "\n== continue 2 di dalam switch ==\n";
$pembeli = [
    ["nama" => "Budi", "tipe" => "member"],
    ["nama" => "Siti", "tipe" => "guest"],
    ["nama" => "Andi", "tipe" => "member"],
];

foreach ($pembeli as $orang) {
    switch ($orang["tipe"]) {
        case "guest":
            continue 2;
        default:
            echo "Member diproses: {$orang['nama']}\n";
    }
}

echo "\n== Ekstraksi ke function ==\n";
function prosesPembeli(array $daftarPembeli): void
{
    foreach ($daftarPembeli as $orang) {
        if ($orang["nama"] === "") {
            return;
        }
        if ($orang["tipe"] !== "member") {
            continue;
        }
        echo "Member diproses: {$orang['nama']}\n";
    }
}

prosesPembeli([
    ["nama" => "Budi", "tipe" => "member"],
    ["nama" => "Siti", "tipe" => "guest"],
    ["nama" => "", "tipe" => "member"],
    ["nama" => "Andi", "tipe" => "member"],
]);