Langsung ke konten
Belajar PHP

Tutorial Membuat Pengulangan Bersyarat di PHP

Foto FachriOleh Fachri
Membuat Pengulangan Bersyarat

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

PHP Snippet PHP
while (kondisi) {
 // blok kode yang diulang
}

Contoh: Mengalikan Angka Sampai Batas Tertentu

PHP Snippet PHP
<?php
$i = 10;

while ($i <= 1000) {
 echo $i. '<br/>';
 $i = $i * 5;
}
?>

Penjelasan:

  • Awalnya $i bernilai 10.
  • Syarat loop: $i <= 1000.
  • Setiap iterasi, $i dikalikan 5 → 10, 50, 250, 1250.
  • Ketika $i = 1250, syarat 1250 <= 1000 bernilai false, sehingga loop berhenti.

Output:

Block Code Snippet Code
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 Snippet PHP
<?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

PHP Snippet PHP
do {
 // blok kode dijalankan minimal sekali
} while (kondisi);

Contoh: Meminta Input Pengguna

PHP Snippet PHP
<?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

PHP Snippet PHP
for (inisialisasi; kondisi; increment) {
 // blok kode
}

Contoh: Menampilkan Bilangan Genap

PHP Snippet PHP
<?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:

  1. $i = 1 — Inisialisasi: dijalankan sekali saat loop dimulai.
  2. $i <= 20 — Kondisi: diperiksa sebelum setiap iterasi.
  3. $i++ — Increment: dijalankan di akhir setiap iterasi.

Contoh: Nested For (Perulangan Bersarang)

PHP Snippet PHP
<?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

PHP Snippet PHP
foreach ($array as $nilai) {
 // lakukan sesuatu dengan $nilai
}

Sintaks — Mengakses Kunci dan Nilai

PHP Snippet PHP
foreach ($array as $kunci => $nilai) {
 // lakukan sesuatu dengan $kunci dan $nilai
}

Contoh: Menampilkan Data Mahasiswa

PHP Snippet PHP
<?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 Snippet PHP
<?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 Snippet PHP
<?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 Snippet PHP
<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

  1. Lupa mengubah variabel pengontrol — Loop berjalan terus tanpa perubahan pada kondisi.
  2. Syarat yang mustahil tercapai — Seperti $i != 999 ketika $i melompat dari 250 ke 1250.
  3. Kesalahan logika pada increment/decrement — Misalnya menggunakan $i++ tetapi seharusnya $i--.

Cara Melindungi Diri dari Infinite Loop

PHP Snippet PHP
<?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 (&) pada foreach untuk menghindari duplikasi data:
PHP Snippet PHP
<?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 yield untuk memproses data secara bertahap:
PHP Snippet PHP
<?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, dan array_walk yang 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 Snippet PHP
<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 Snippet PHP
<?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 Snippet PHP
<?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:

  1. Menentukan syarat yang benar — agar loop pasti berhenti.
  2. Menggunakan break dan continue — untuk kontrol alur yang lebih presisi.
  3. Mengoptimalkan memori — terutama untuk dataset besar.
  4. 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.

Komentar

Memuat komentar…

Tinggalkan Komentar

Alamat email Anda tidak akan dipublikasikan.