BAB 4: PERULANGAN (LOOPS)

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
<?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
<?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 (;):

BagianNamaKapan dijalankanContoh
$i = 1InitSekali, sebelum loop dimulaiMembuat dan mengisi variabel counter
$i <= 5ConditionSebelum setiap iterasiDicek, jika true body dijalankan
$i++IncrementSetelah body selesaiMenambah counter supaya loop berakhir

Urutan eksekusinya selalu sama: init → cek condition → body → increment → cek condition → body → increment → ... sampai condition bernilai false.

Loop Anatomy

📊 Memuat diagram…
💡Tip

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:

IterasiNilai $iCek $i <= 3Aksi bodySetelah increment
Start1
11truecetak "1"$i jadi 2
22truecetak "2"$i jadi 3
33truecetak "3"$i jadi 4
Selesai4falseloop 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
<?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
<?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
<?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";
}

?>
💡Tip

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
<?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
<?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
<?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
<?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
<?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;
}

?>
⚠️Perhatian

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

  1. Gunakan for loop saat jumlah iterasi sudah diketahui (misal: 10 kali, sepanjang array). Jika jumlahnya tidak pasti, pertimbangkan while (materi 4-2).
  2. Beri nama variabel counter yang deskriptif: $i untuk index umum, $row/$col untuk matriks, $day untuk hari.
  3. Jangan lupa titik koma di akhir statement di dalam body — error sintaks paling umum.
  4. Cek batas atas dengan < bukan <= saat mengiterasi array, karena index array dimulai dari 0.

Exercise

  1. Print bilangan genap dari 1-20
  2. Buat pattern bintang: persegi 5x5
  3. Hitung total dari 1+2+3+...+100
  4. Buat for loop yang mencetak tabel perkalian 7 (7 x 1 = 7, 7 x 2 = 14, ... sampai 7 x 10 = 70)
  5. Buat for loop untuk menghitung rata-rata nilai [80, 90, 75, 85, 95]
  6. Kenapa kode ini infinite loop?
php
<?php
for ($i = 1; $i <= 10; $i--) {
    echo $i;
}
?>

Summary

PoinPenjelasan
Syntax forfor (init; condition; increment)
Urutan eksekusiinit → cek condition → body → increment → ulang
Condition falseLoop langsung berhenti
Count up/down$i++ untuk naik, $i-- untuk turun
Increment custom$i += 2 untuk lompat 2 angka
Nested loopLoop di dalam loop untuk pola/matriks
Infinite loopCondition tidak pernah false — hindari!
Off-by-oneGunakan < count($array) bukan <=
Kapan dipakaiJumlah iterasi sudah diketahui di awal

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 4

Uji pemahamanmu tentang Perulangan (Loops)