
- 1Mengapa Pengulangan Bersyarat Diperlukan?
- 21. Perulangan While
- 2.1Sintaks Dasar
- 2.2Contoh: Mengalikan Angka Sampai Batas Tertentu
- 2.3Pentingnya Menentukan Syarat yang Tepat
- 32. Perulangan Do-While
- 3.1Sintaks
- 3.2Contoh: Meminta Input Pengguna
- 43. Perulangan For
- 4.1Sintaks
- 4.2Contoh: Menampilkan Bilangan Genap
- 4.3Contoh: Nested For (Perulangan Bersarang)
- 54. Perulangan Foreach
- 5.1Sintaks — Mengakses Nilai Saja
- 5.2Sintaks — Mengakses Kunci dan Nilai
- 5.3Contoh: Menampilkan Data Mahasiswa
- 65. Break dan Continue: Mengontrol Alur Loop
- 6.1Perintah Break
- 6.2Perintah Continue
- 6.3Berbantuan Label pada Loop Bersarang
- 76. Bahaya Infinite Loop dan Cara Mengatasinya
- 7.1Penyebab Umum Infinite Loop
- 7.2Cara Melindungi Diri dari Infinite Loop
- 87. Efisiensi Memori untuk Dataset Besar
- 8.1Tips Efisiensi
- 98. Validasi dan Keamanan di Dalam Loop
- 9.1Validasi Input dalam Loop
- 9.2Perlindungan dari Injeksi SQL
- 9.3Rate Limiting di Dalam Loop
- 10Perbandingan Jenis Loop
- 11Kesimpulan
- 12Hal yang sering ditanyakan seputar Pengulangan Bersyarat PHP
- 12.1Apa yang dimaksud dengan pengulangan bersyarat di PHP?
- 12.2Apa perbedaan while dan do-while dalam PHP?
- 12.3Bagaimana mencegah infinite loop saat menulis perulangan?
Pengulangan bersyarat (conditional loop) adalah salah satu struktur kontrol paling penting dalam pemrograman PHP. Berbeda dari pengulangan biasa yang hanya menjalankan blok kode secara berulang, pengulangan bersyarat memungkinkan kita menetapkan syarat atau kondisi khusus yang harus terpenuhi agar loop berlanjut atau berhenti. Dalam tutorial ini, kita akan membahas secara menyeluruh semua jenis pengulangan bersyarat di PHP: while, do-while, for, foreach, serta penggunaan break, continue, dan teknik efisiensi untuk dataset besar.
Mengapa Pengulangan Bersyarat Diperlukan?
Dalam banyak kasus nyata, kita tidak tahu pasti berapa kali sebuah blok kode perlu dijalankan. Misalnya:
- Memeriksa apakah username yang dipilih pengunjung sudah ada yang menggunakan sebelumnya.
- Membaca data dari database satu per satu hingga habis.
- Memproses input pengguna hingga pengguna menekan tombol tertentu.
- Menampilkan daftar postingan artikel di WordPress secara dinamis.
Pengulangan bersyarat menjawab kebutuhan-kebutuhan tersebut dengan memungkinkan loop berhenti berdasarkan kondisi runtime, bukan hanya jumlah iterasi tetap.
1. Perulangan While
Perulangan while adalah bentuk pengulangan bersyarat yang paling dasar. Loop akan terus berjalan selama kondisi yang ditentukan bernilai true.
Sintaks Dasar
while (kondisi) {
// blok kode yang diulang
}
Contoh: Mengalikan Angka Sampai Batas Tertentu
<?php
$i = 10;
while ($i <= 1000) {
echo $i. '<br/>';
$i = $i * 5;
}
?>
Penjelasan:
- Awalnya
$ibernilai 10. - Syarat loop:
$i <= 1000. - Setiap iterasi,
$idikalikan 5 → 10, 50, 250, 1250. - Ketika
$i = 1250, syarat1250 <= 1000bernilaifalse, sehingga loop berhenti.
Output:
10
50
250
Perhatikan bahwa angka 1250 tidak ditampilkan karena kondisi diperiksa sebelum blok kode dieksekusi (pre-test loop).
Pentingnya Menentukan Syarat yang Tepat
Anda harus sangat berhati-hati dalam menentukan syarat. Jika syarat tidak pernah bernilai false, loop akan berjalan terus dan menyebabkan infinite loop (loop tak terhingga) yang bisa membuat program hang atau crash.
<?php
// CONTOH YANG BERBAHAYA - INFINITE LOOP!
$i = 10;
while ($i != 999) { // $i tidak akan pernah bernilai 999
echo $i. '<br/>';
$i = $i * 5; // 10 → 50 → 250 → 1250 → dst.
}
// Loop tidak pernah berhenti karena $i tidak pernah sama dengan 999
?>
Selalu pastikan variabel pengontrol loop pasti akan mencapai kondisi akhir yang membuat loop berhenti.
2. Perulangan Do-While
Berbeda dari while, perulangan do-while mengeksekusi blok kode terlebih dahulu baru memeriksa kondisi (post-test loop). Ini berarti blok kode dijamin minimal dieksekusi satu kali.
Sintaks
do {
// blok kode dijalankan minimal sekali
} while (kondisi);
Contoh: Meminta Input Pengguna
<?php
$nama = '';
// Simulasi input — dalam kenyataan ini bisa $_POST['nama']
$input_data = ['budi', 'andi', 'siti'];
$index = 0;
do {
$nama = $input_data[$index] ?? '';
echo "Selamat datang, ". htmlspecialchars($nama). '<br/>';
$index++;
} while ($index < count($input_data));
// Output:
// Selamat datang, budi
// Selamat datang, andi
// Selamat datang, siti
?>
Kapan menggunakan do-while dibanding while? Gunakan do-while ketika Anda ingin memastikan blok kode dieksekusi minimal sekali, seperti saat memvalidasi input pengguna atau menampilkan menu interaktif.
3. Perulangan For
Perulangan for adalah pengulangan bersyarat yang paling umum digunakan ketika jumlah iterasi sudah diketahui atau dapat dihitung secara matematis. Strukturnya lebih ringkas karena inisialisasi, kondisi, dan increment semuanya ditulis dalam satu baris.
Sintaks
for (inisialisasi; kondisi; increment) {
// blok kode
}
Contoh: Menampilkan Bilangan Genap
<?php
for ($i = 1; $i <= 20; $i++) {
if ($i % 2 == 0) {
echo $i. ' ';
}
}
// Output: 2 4 6 8 10 12 14 16 18 20
?>
Bagaimana for bekerja:
$i = 1— Inisialisasi: dijalankan sekali saat loop dimulai.$i <= 20— Kondisi: diperiksa sebelum setiap iterasi.$i++— Increment: dijalankan di akhir setiap iterasi.
Contoh: Nested For (Perulangan Bersarang)
<?php
for ($baris = 1; $baris <= 5; $baris++) {
for ($kolom = 1; $kolom <= $baris; $kolom++) {
echo '* ';
}
echo '<br/>';
}
// Output:
// *
// * *
// * * *
// * * * *
// * * * * *
?>
Perulangan bersarang memungkinkan manipulasi data multi-dimensi, seperti mengakses array dua dimensi atau membuat pola tertentu.
4. Perulangan Foreach
Perulangan foreach dirancang khusus untuk bekerja dengan array di PHP. Ini adalah cara paling efisien dan paling umum untuk mengiterasi seluruh elemen array.
Sintaks — Mengakses Nilai Saja
foreach ($array as $nilai) {
// lakukan sesuatu dengan $nilai
}
Sintaks — Mengakses Kunci dan Nilai
foreach ($array as $kunci => $nilai) {
// lakukan sesuatu dengan $kunci dan $nilai
}
Contoh: Menampilkan Data Mahasiswa
<?php
$mahasiswa = [
['nama' => 'Budi', 'nim' => 'M001', 'ipk' => 3.8],
['nama' => 'Siti', 'nim' => 'M002', 'ipk' => 3.5],
['nama' => 'Andi', 'nim' => 'M003', 'ipk' => 3.9],
];
echo '<table border="1" cellpadding="5">';
echo '<tr><th>NIM</th><th>Nama</th><th>IPK</th></tr>';
foreach ($mahasiswa as $mhs) {
echo '<tr>';
echo '<td>'. htmlspecialchars($mhs['nim']). '</td>';
echo '<td>'. htmlspecialchars($mhs['nama']). '</td>';
echo '<td>'. $mhs['ipk']. '</td>';
echo '</tr>';
}
echo '</table>';
?>
Kelebihan foreach:
- Tidak perlu menghitung panjang array secara manual.
- Menghindari kesalahan off-by-one error (akses indeks di luar batas).
- Lebih ringkas dan mudah dibaca.
- Bekerja dengan baik untuk array asosiatif maupun numerik.
Dokumentasi lengkap foreach tersedia di PHP Manual: foreach.
5. Break dan Continue: Mengontrol Alur Loop
Perintah Break
break menghentikan loop secara total dan melanjutkan eksekusi ke pernyataan setelah loop.
<?php
$bilangan_prima = [];
$counter = 2;
while (count($bilangan_prima) < 5) {
$is_prima = true;
for ($i = 2; $i <= sqrt($counter); $i++) {
if ($counter % $i == 0) {
$is_prima = false;
break; // tidak perlu cek lagi jika sudah bukan prima
}
}
if ($is_prima) {
$bilangan_prima[] = $counter;
}
$counter++;
}
echo '5 bilangan prima pertama: '. implode(', ', $bilangan_prima);
// Output: 5 bilangan prima pertama: 2, 3, 5, 7, 11
?>
Penggunaan break di sini sangat efisien: begitu ditemukan pembagi, kita langsung berhenti tanpa membuang waktu memeriksa sisa angka.
Perintah Continue
continue melewati sisa blok kode pada iterasi saat ini dan langsung melanjutkan ke iterasi berikutnya.
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i % 3 == 0) {
continue; // lewati bilangan yang habis dibagi 3
}
echo $i. ' ';
}
// Output: 1 2 4 5 7 8 10
?>
Berbantuan Label pada Loop Bersarang
Ketika menggunakan loop bersarang, break dan continue secara default hanya mempengaruhi loop terdalam. Untuk mengontrol loop luar, gunakan label:
<php
// Mencari angka pertama yang habis dibagi 3 DAN 5
outer:
for ($x = 1; $x <= 100; $x++) {
for ($y = 1; $y <= 100; $y++) {
$hasil = $x * $y;
if ($hasil % 3 == 0 && $hasil % 5 == 0) {
echo "Ditemukan: $x × $y = $hasil<br/>";
break outer; // keluar dari SEMUA loop
}
}
}
?>
6. Bahaya Infinite Loop dan Cara Mengatasinya
Infinite loop adalah kondisi di mana loop tidak pernah berhenti karena kondisi selalu bernilai true. Ini bisa membuat PHP script memakan seluruh resource server.
Penyebab Umum Infinite Loop
- Lupa mengubah variabel pengontrol — Loop berjalan terus tanpa perubahan pada kondisi.
- Syarat yang mustahil tercapai — Seperti
$i != 999ketika$imelompat dari 250 ke 1250. - Kesalahan logika pada increment/decrement — Misalnya menggunakan
$i++tetapi seharusnya$i--.
Cara Melindungi Diri dari Infinite Loop
<?php
$max_iterasi = 1000; // batas keamanan
$iterasi = 0;
$nilai = 10;
while ($nilai != 999) {
$iterasi++;
if ($iterasi >= $max_iterasi) {
echo "PERINGATAN: Loop dipaksa berhenti setelah $max_iterasi iterasi<br/>";
break;
}
$nilai = $nilai * 5;
echo "Iterasi $iterasi: $nilai<br/>";
}
?>
Menggunakan batas iterasi (safety counter) adalah praktik defensif yang sangat direkomendasikan, terutika saat memproses data dari sumber eksternal.
7. Efisiensi Memori untuk Dataset Besar
Ketika memproses dataset berukuran besar (ribuan hingga jutaan baris data), cara Anda menulis loop dapat berdampak besar pada performa dan penggunaan memori.
Tips Efisiensi
- Hindari menyalin array besar — Gunakan referensi (
&) padaforeachuntuk menghindari duplikasi data:
<?php
$data_besar = range(1, 100000);
// TIDAK efisien — setiap elemen disalin
foreach ($data_besar as $nilai) {
$nilai *= 2; // hanya mengubah salinan lokal!
}
// Efisien — bekerja langsung pada elemen asli
foreach ($data_besar as &$nilai) {
$nilai *= 2;
}
unset($nilai); // putuskan referensi setelah selesai
?>
- Gunakan generator untuk dataset sangat besar — Daripada memuat seluruh dataset ke memori sekaligus, gunakan
yielduntuk memproses data secara bertahap:
<?php
function baca_file_besar($nama_file) {
$handle = fopen($nama_file, 'r');
if ($handle) {
while (($baris = fgets($handle)) !== false) {
yield trim($baris);
}
fclose($handle);
}
}
// File 1 GB tidak akan memenuhi RAM
foreach (baca_file_besar('data_besar.csv') as $baris) {
// proses satu baris pada satu waktu
echo htmlspecialchars($baris). '<br/>';
}
?>
- Hindari loop bersarang yang tidak perlu — Gunakan fungsi built-in seperti
array_map,array_filter,array_reduce, danarray_walkyang dioptimalkan di tingkat C oleh Zend Engine. - Pertimbangkan penggunaan SplFixedArray — Untuk array numerik statis, SplFixedArray menggunakan memori lebih efisien dibanding array PHP biasa.
8. Validasi dan Keamanan di Dalam Loop
Ketika loop memproses data dari pengguna atau sumber eksternal, keamanan menjadi prioritas utama.
Validasi Input dalam Loop
<php
$pengguna = [
'budi@email.com',
'invalid-email',
'andi@email.com',
'sql;DROP TABLE users;--',
];
$email_valid = [];
foreach ($pengguna as $input) {
// Validasi format email
if (!filter_var($input, FILTER_VALIDATE_EMAIL)) {
echo "Input tidak valid dilewati: ". htmlspecialchars($input). '<br/>';
continue; // lanjut ke iterasi berikutnya
}
// Sanitasi untuk keamanan
$bersih = filter_var($input, FILTER_SANITIZE_EMAIL);
$email_valid[] = $bersih;
}
echo 'Email valid: '. implode(', ', $email_valid);
// Output: Email valid: budi@email.com, andi@email.com
?>
Perlindungan dari Injeksi SQL
Jika loop Anda memproses input untuk query database, jangan pernah menyisipkan input langsung ke dalam SQL:
<?php
// SALAH — rentan SQL injection!
foreach ($_POST['ids'] as $id) {
$query = "SELECT * FROM users WHERE id = $id"; // BERBAHAYA
}
// BENAR — gunakan prepared statement
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
foreach ($_POST['ids'] as $id) {
if (is_numeric($id)) {
$stmt->execute([$id]);
$hasil = $stmt->fetch();
// proses hasil
}
}
?>
Rate Limiting di Dalam Loop
Jika loop berinteraksi dengan API eksternal, pastikan untuk menerapkan rate limiting agar tidak melampaui batas kuota API:
<?php
$items = [/* daftar item yang perlu diproses */];
foreach ($items as $index => $item) {
// Proses item
proses_item($item);
// Rate limiting: jeda 1 detik setiap 10 request
if (($index + 1) % 10 == 0) {
sleep(1);
}
}
?>
Perbandingan Jenis Loop
| Fitur | while | do-while | for | foreach |
|---|---|---|---|---|
| Kapan kondisi diperiksa | Sebelum iterasi | Setelah iterasi | Sebelum iterasi | Tiap elemen |
| Minimal sekali dijalankan | Tidak | Ya | Tidak | Jika array tidak kosong |
| Cocok untuk | Kondisi tidak diketahui di awal | Input validasi, menu | Iterasi terhitung | Mengiterasi array |
| Risiko infinite loop | Tinggi | Tinggi | Rendah | Hampir tidak ada |
Referensi lengkap tentang struktur kontrol pengulangan di PHP tersedia di PHP Manual: Control Structures.
Kesimpulan
Pengulangan bersyarat adalah alat yang sangat powerful dalam PHP. Dengan menguasai while, do-while, for, dan foreach, Anda bisa menangani hampir semua skenario pemrosesan data secara berulang. Kunci utamanya adalah:
- Menentukan syarat yang benar — agar loop pasti berhenti.
- Menggunakan
breakdancontinue— untuk kontrol alur yang lebih presisi. - Mengoptimalkan memori — terutama untuk dataset besar.
- Memvalidasi input — di setiap iterasi untuk keamanan.
Dengan menerapkan praktik-praktik ini, kode PHP Anda akan lebih efisien, aman, dan mudah dipelihara.
Hal yang sering ditanyakan seputar Pengulangan Bersyarat PHP
Apa yang dimaksud dengan pengulangan bersyarat di PHP?
Pengulangan bersyarat adalah perulangan yang berjalan selama kondisi tertentu terpenuhi, contohnya while loop dan do-while loop di PHP.
Apa perbedaan while dan do-while dalam PHP?
While mengecek kondisi sebelum menjalankan blok kode, sedangkan do-while menjalankan blok kode terlebih dahulu baru mengecek kondisi, sehingga minimal satu kali eksekusi.
Bagaimana mencegah infinite loop saat menulis perulangan?
Pastikan ada increment atau perubahan variabel kondisi di dalam blok perulangan, dan selalu uji batas iterasi dengan nilai awal yang logis.
Memuat komentar…