4-1: For Loop
Objectives
- Memahami cara kerja for loop
- Menggunakan for loop dengan benar
- Mengenali dan avoid infinite loops
- Memahami kapan for loop adalah pilihan yang tepat
- Menggunakan for loop untuk pola umum (count up, count down, akumulasi, nested loop)
Kenapa Perlu Perulangan?
Bayangkan kamu diminta menulis program yang mencetak angka 1 sampai 100. Tanpa perulangan, kamu harus menulis 100 baris echo. Itu membosankan, rawan salah ketik, dan tidak praktis. Sekarang bayangkan angka 1 sampai 1.000.000 — mustahil ditulis manual.
Di sinilah perulangan (loop) berperan. Dengan for loop, kamu cukup menulis satu blok kode kecil, dan PHP akan mengulanginya sebanyak yang kamu mau:
<?php
// Mencetak 1 sampai 1.000.000 hanya dengan 3 baris
for ($i = 1; $i <= 1000000; $i++) {
echo $i . "\n";
}
?>
Loop adalah salah satu fondasi paling penting dalam programming. Hampir semua program nyata memakai loop: membaca data dari database, menampilkan daftar produk, menghitung total belanja, dan sebagainya.
Basic For Loop
<?php
// Syntax: for (init; condition; increment)
for ($i = 1; $i <= 5; $i++) {
echo "Angka: $i\n";
}
/*
Output:
Angka: 1
Angka: 2
Angka: 3
Angka: 4
Angka: 5
*/
?>
Perhatikan tiga bagian di dalam kurung for loop, dipisahkan oleh titik koma (;):
| Bagian | Nama | Kapan dijalankan | Contoh |
|---|---|---|---|
$i = 1 | Init | Sekali, sebelum loop dimulai | Membuat dan mengisi variabel counter |
$i <= 5 | Condition | Sebelum setiap iterasi | Dicek, jika true body dijalankan |
$i++ | Increment | Setelah body selesai | Menambah counter supaya loop berakhir |
Urutan eksekusinya selalu sama: init → cek condition → body → increment → cek condition → body → increment → ... sampai condition bernilai false.
Loop Anatomy
Karena condition dicek sebelum body dijalankan, for loop bisa saja tidak pernah berjalan sama sekali. Contoh: for ($i = 10; $i <= 5; $i++) langsung selesai karena condition sudah false sejak awal.
Step-by-Step Eksekusi
Mari kita telusuri for ($i = 1; $i <= 3; $i++) secara manual:
| Iterasi | Nilai $i | Cek $i <= 3 | Aksi body | Setelah increment |
|---|---|---|---|---|
| Start | 1 | — | — | — |
| 1 | 1 | true | cetak "1" | $i jadi 2 |
| 2 | 2 | true | cetak "2" | $i jadi 3 |
| 3 | 3 | true | cetak "3" | $i jadi 4 |
| Selesai | 4 | false | loop berhenti | — |
Dengan tabel ini, mudah untuk memprediksi output dari for loop mana pun. Latihan mental seperti ini sangat berguna saat debugging: jalankan "loop di kepala" kamu baris per baris.
Common Patterns
Count Up
<?php
// 1 to 10
for ($i = 1; $i <= 10; $i++) {
echo $i . " ";
}
// Output: 1 2 3 4 5 6 7 8 9 10
// Count down
for ($i = 10; $i >= 1; $i--) {
echo $i . " ";
}
// Output: 10 9 8 7 6 5 4 3 2 1
// Skip by 2 (even numbers)
for ($i = 0; $i <= 10; $i += 2) {
echo $i . " ";
}
// Output: 0 2 4 6 8 10
// Kelipatan 5 (naik 5)
for ($i = 5; $i <= 25; $i += 5) {
echo $i . " ";
}
// Output: 5 10 15 20 25
?>
Total Akumulasi (Accumulator)
Pola ini sangat umum: gunakan sebuah variabel di luar loop untuk menampung hasil.
<?php
// Hitung total 1 + 2 + 3 + ... + 100
$total = 0;
for ($i = 1; $i <= 100; $i++) {
$total += $i;
}
echo "Total: $total\n";
// Output: Total: 5050
// Hitung total belanja dari array harga
$prices = [15000, 25000, 30000, 10000];
$grandTotal = 0;
for ($i = 0; $i < count($prices); $i++) {
$grandTotal += $prices[$i];
}
echo "Total belanja: Rp " . number_format($grandTotal) . "\n";
// Output: Total belanja: Rp 80.000
?>
Loop dengan Array
<?php
$fruits = ["Apple", "Banana", "Cherry"];
for ($i = 0; $i < count($fruits); $i++) {
echo $fruits[$i] . "\n";
}
/*
Output:
Apple
Banana
Cherry
*/
// ⚠️ Cache array length untuk performance
for ($i = 0, $len = count($fruits); $i < $len; $i++) {
echo $fruits[$i] . "\n";
}
?>
count() dipanggil ulang setiap iterasi jika ditulis langsung di condition. Untuk array kecil tidak masalah, tapi untuk array berukuran besar, simpan panjangnya di variabel seperti contoh di atas. Ini juga membuat kode lebih mudah dibaca.
Loop Melalui String
String juga bisa diakses per karakter dengan indeks, seperti array.
<?php
$word = "PHP";
for ($i = 0; $i < strlen($word); $i++) {
echo $word[$i] . "\n";
}
/*
Output:
P
H
P
*/
// Membalik string dengan for
$text = "KODING";
$reversed = "";
for ($i = strlen($text) - 1; $i >= 0; $i--) {
$reversed .= $text[$i];
}
echo $reversed . "\n";
// Output: GNIDOK
?>
Nested For Loop
For loop di dalam for loop disebut nested loop. Berguna untuk membuat pola, matriks, dan tabel.
<?php
// Pattern: Segitiga
for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo "*";
}
echo "\n";
}
/*
Output:
*
**
***
****
*****
*/
// Pattern: Persegi 3x3
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
echo "*";
}
echo "\n";
}
/*
Output:
***
***
***
*/
?>
Perhatikan pola pada segitiga: loop dalam ($j) berjalan dari 1 sampai nilai $i saat itu. Jadi saat $i = 1, satu bintang dicetak; saat $i = 2, dua bintang, dan seterusnya.
Edge Cases
Multiple Init dan Increment
PHP mengizinkan beberapa ekspresi di bagian init dan increment, dipisahkan koma:
<?php
// Dua counter sekaligus
for ($i = 1, $j = 10; $i <= 5; $i++, $j--) {
echo "$i-$j ";
}
// Output: 1-10 2-9 3-8 4-7 5-6
?>
Bagian Kosong
Semua bagian for loop boleh dikosongkan. Jika condition dikosongkan, PHP menganggapnya selalu true — ini menjadi infinite loop!
<?php
// Condition kosong = selalu true (infinite!)
// for ($i = 1; ; $i++) {
// echo $i;
// }
// Pattern: break di dalam body untuk keluar
for ($i = 1; ; $i++) {
if ($i > 5) {
break;
}
echo $i . " ";
}
// Output: 1 2 3 4 5
?>
Infinite Loop
<?php
// ❌ INFINITE LOOP!
for ($i = 1; $i <= 10; $i--) {
echo $i;
}
// $i selalu decrement, tidak pernah >= 10
// ❌ VARIABLE TIDAK BERUBAH
for ($i = 1; $i <= 10;) {
echo $i;
// Lupa increment!
}
// ✅ FIX: Pastikan increment/decrement benar
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
?>
Infinite loop membuat program hang (berhenti merespons) dan bisa menghabiskan 100% CPU. Jika program kamu tiba-tiba "macet", cek apakah ada loop yang condition-nya tidak pernah menjadi false. Di lingkungan pengembangan, kamu biasanya bisa menghentikan proses dengan Ctrl+C.
Common Mistakes
Off-by-One Error
<?php
$items = ["A", "B", "C"];
// ❌ Salah: index 3 tidak ada (array cuma 0..2)
for ($i = 0; $i <= count($items); $i++) {
echo $items[$i] . "\n"; // Warning di iterasi terakhir!
}
// ✅ Benar: gunakan < bukan <=
for ($i = 0; $i < count($items); $i++) {
echo $items[$i] . "\n";
}
?>
Salah Operator di Condition
<?php
// ❌ Salah: = adalah assignment, bukan perbandingan
// for ($i = 1; $i = 10; $i++) { ... } // $i selalu di-set 10, loop tak berujung
// ✅ Benar: gunakan == atau === untuk membandingkan
for ($i = 1; $i == 10; $i++) {
// ...
}
// Catatan: loop ini tidak berjalan sama sekali karena $i = 1 != 10 di awal
?>
Mengubah Counter di Dalam Body
<?php
// ⚠️ Berbahaya: counter diubah manual di dalam body
$skip = 3;
for ($i = 1; $i <= 10; $i++) {
if ($i === $skip) {
$i = 8; // Melompati banyak iterasi secara tidak terduga
}
echo $i . " ";
}
// Output: 1 2 3 8 9 10
// Sebaiknya hindari; gunakan continue (dibahas di materi 4-4)
?>
Pro Tips
- Gunakan for loop saat jumlah iterasi sudah diketahui (misal: 10 kali, sepanjang array). Jika jumlahnya tidak pasti, pertimbangkan
while(materi 4-2). - Beri nama variabel counter yang deskriptif:
$iuntuk index umum,$row/$coluntuk matriks,$dayuntuk hari. - Jangan lupa titik koma di akhir statement di dalam body — error sintaks paling umum.
- Cek batas atas dengan
<bukan<=saat mengiterasi array, karena index array dimulai dari 0.
Exercise
- Print bilangan genap dari 1-20
- Buat pattern bintang: persegi 5x5
- Hitung total dari 1+2+3+...+100
- Buat for loop yang mencetak tabel perkalian 7 (7 x 1 = 7, 7 x 2 = 14, ... sampai 7 x 10 = 70)
- Buat for loop untuk menghitung rata-rata nilai
[80, 90, 75, 85, 95] - Kenapa kode ini infinite loop?
<?php
for ($i = 1; $i <= 10; $i--) {
echo $i;
}
?>
Summary
| Poin | Penjelasan |
|---|---|
| Syntax for | for (init; condition; increment) |
| Urutan eksekusi | init → cek condition → body → increment → ulang |
Condition false | Loop langsung berhenti |
| Count up/down | $i++ untuk naik, $i-- untuk turun |
| Increment custom | $i += 2 untuk lompat 2 angka |
| Nested loop | Loop di dalam loop untuk pola/matriks |
| Infinite loop | Condition tidak pernah false — hindari! |
| Off-by-one | Gunakan < count($array) bukan <= |
| Kapan dipakai | Jumlah iterasi sudah diketahui di awal |
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 4
Uji pemahamanmu tentang Perulangan (Loops)