BAB 4: PERULANGAN (LOOPS)

4-3: Foreach Loop

Objectives

  • Menggunakan foreach untuk array
  • Memahami key => value iteration
  • Menggunakan reference dalam foreach
  • Mengiterasi array multidimensi (nested foreach)
  • Menghindari common mistakes saat foreach

Kenapa Foreach?

Foreach adalah perulangan khusus untuk array (dan object). Berbeda dengan for yang mengharuskan kamu mengurus index, counter, dan panjang array secara manual, foreach menangani semuanya otomatis — kamu tinggal bilang "untuk setiap elemen di array ini, lakukan sesuatu".

📊 Memuat diagram…
php
<?php

// FOR: harus urus index manual
$fruits = ["Apple", "Banana", "Cherry"];
for ($i = 0; $i < count($fruits); $i++) {
    echo $fruits[$i] . "\n";
}

// FOREACH: jauh lebih sederhana
foreach ($fruits as $fruit) {
    echo $fruit . "\n";
}

?>

Keduanya menghasilkan output yang sama, tapi foreach lebih pendek, lebih mudah dibaca, dan tidak mungkin terkena off-by-one error.

Basic Foreach

php
<?php

$fruits = ["Apple", "Banana", "Cherry"];

// Iterate values only
foreach ($fruits as $fruit) {
    echo "$fruit\n";
}

/*
Output:
Apple
Banana
Cherry
*/

?>

Pada setiap iterasi, PHP mengambil satu elemen array dan menaruhnya ke variabel $fruit. Secara default, foreach bekerja dengan salinan (copy) nilai — mengubah $fruit tidak akan mengubah array aslinya.

Foreach dengan Key

php
<?php

$user = [
    "name" => "Andi",
    "email" => "andi@example.com",
    "age" => 25
];

// Iterate key => value
foreach ($user as $key => $value) {
    echo "$key: $value\n";
}

/*
Output:
name: Andi
email: andi@example.com
age: 25
*/

?>

Indexed Array dengan Key

Untuk array ber-index angka, $key akan berisi index-nya:

php
<?php

$colors = ["Red", "Green", "Blue"];

foreach ($colors as $index => $color) {
    echo "$index: $color\n";
}

/*
Output:
0: Red
1: Green
2: Blue
*/

?>
💡Tip

Gunakan bentuk key => value ketika kamu butuh posisi/index elemen — misalnya untuk memberi nomor urut pada daftar, atau mencari elemen tertentu.

Membuat Daftar Bernomor (Pola Umum)

php
<?php

$students = ["Andi", "Budi", "Citra", "Dewi"];

foreach ($students as $index => $student) {
    $number = $index + 1;  // Nomor urut mulai dari 1
    echo "$number. $student\n";
}

/*
Output:
1. Andi
2. Budi
3. Citra
4. Dewi
*/

?>

Modify Array dengan Reference

php
<?php

$numbers = [1, 2, 3, 4, 5];

// ❌ Gak bisa modifikasi langsung
foreach ($numbers as $num) {
    $num *= 2;  // Tidak mengubah array asli!
}
print_r($numbers);  // [1, 2, 3, 4, 5]

// ✅ Gunakan reference (&)
foreach ($numbers as &$num) {
    $num *= 2;
}
unset($num);  // ⚠️ Penting! unset reference
print_r($numbers);  // [2, 4, 6, 8, 10]

?>
⚠️Perhatian

Penting: Setelah foreach dengan reference, selalu unset($value) untuk avoid bugs later. Variable masih referensi ke element terakhir.

Kenapa bug ini berbahaya? Setelah loop selesai, $num masih "menempel" ke elemen terakhir array. Jika kamu memakai ulang variabel $num di tempat lain, kamu diam-diam mengubah isi array!

php
<?php

$numbers = [1, 2, 3];

foreach ($numbers as &$num) {
    // isi loop
}
// Lupa unset($num)...

$num = 100;  // ⚠️ Ini mengubah $numbers[2] menjadi 100!
print_r($numbers);
// Output: Array ( [0] => 1 [1] => 2 [2] => 100 )

?>

Nested Foreach

Untuk array multidimensi, gunakan foreach di dalam foreach:

php
<?php

$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

foreach ($matrix as $row) {
    foreach ($row as $cell) {
        echo $cell . " ";
    }
    echo "\n";
}

/*
Output:
1 2 3
4 5 6
7 8 9
*/

?>

Nested Foreach dengan Associative Array

Pola ini sangat umum untuk menampilkan data dari database:

php
<?php

$users = [
    ["name" => "Andi", "city" => "Jakarta"],
    ["name" => "Budi", "city" => "Bandung"],
    ["name" => "Citra", "city" => "Surabaya"]
];

foreach ($users as $user) {
    echo $user["name"] . " - " . $user["city"] . "\n";
}

/*
Output:
Andi - Jakarta
Budi - Bandung
Citra - Surabaya
*/

// Dengan key di loop luar
foreach ($users as $index => $user) {
    echo "User ke-" . ($index + 1) . ": " . $user["name"] . "\n";
}

/*
Output:
User ke-1: Andi
User ke-2: Budi
User ke-3: Citra
*/

?>

Menghitung Total dengan Foreach

php
<?php

$products = [
    ["name" => "Keyboard", "price" => 150000],
    ["name" => "Mouse", "price" => 75000],
    ["name" => "Monitor", "price" => 1200000]
];

$total = 0;

foreach ($products as $product) {
    echo $product["name"] . ": Rp " . number_format($product["price"]) . "\n";
    $total += $product["price"];
}

echo "Total: Rp " . number_format($total) . "\n";

/*
Output:
Keyboard: Rp 150.000
Mouse: Rp 75.000
Monitor: Rp 1.200.000
Total: Rp 1.425.000
*/

?>

Foreach pada Object (Sekilas)

Foreach juga bisa mengiterasi property dari sebuah object — akan dibahas detail di buku Modern PHP (OOP), tapi contoh singkatnya:

php
<?php

$person = new stdClass();
$person->name = "Andi";
$person->age = 25;

foreach ($person as $property => $value) {
    echo "$property: $value\n";
}

/*
Output:
name: Andi
age: 25
*/

?>

Common Mistakes

Hapus Element Saat Iterate

php
<?php

$users = ["Andi", "Budi", "Citra"];

// ❌ Hapus element saat iterate (causes issues)
foreach ($users as $user) {
    if ($user === "Budi") {
        unset($users[1]);  // ⚠️ Jangan lakukan ini!
    }
    echo $user . "\n";
}

// ✅ Fix: iterate over copy
foreach ($users as $user) {
    if ($user === "Budi") {
        unset($users[array_search("Budi", $users)]);
    }
    echo $user . "\n";
}

?>
⚠️Perhatian

Mengubah array (menambah/menghapus element) di tengah foreach menghasilkan perilaku yang tidak terduga. Lebih aman: kumpulkan dulu index yang mau dihapus, lalu hapus setelah loop selesai — atau gunakan array_filter().

Lupa bahwa Foreach Membuat Salinan

php
<?php

$scores = [70, 80, 90];

// ❌ Ingin menambah 5 poin ke semua nilai
foreach ($scores as $score) {
    $score += 5;  // Hanya mengubah salinan!
}

print_r($scores);
// Output: Array ( [0] => 70 [1] => 80 [2] => 90 )  ← Tidak berubah!

// ✅ Pakai reference
foreach ($scores as &$score) {
    $score += 5;
}
unset($score);

print_r($scores);
// Output: Array ( [0] => 75 [1] => 85 [2] => 95 )

?>

Foreach vs For (Kapan Pakai Apa)

SituasiPakai
Iterasi semua elemen arrayforeach
Perlu index untuk operasi lainforeach ($arr as $i => $v)
Perlu mengubah elemen arrayforeach + & reference
Loop dengan step (misal tiap 2)for
Loop mundur dari akhir arrayfor
Iterasi object/propertyforeach
💡Tip

Di PHP modern, foreach hampir selalu pilihan pertama untuk array. for baru dipakai jika kamu butuh kontrol index yang presisi (step, mundur, atau kondisi berhenti khusus).

Pro Tips

  1. Selalu unset() reference setelah foreach dengan &.
  2. Jangan ubah array saat di-foreach — kumpulkan dulu, proses setelahnya.
  3. array_map() dan array_filter() (dibahas di chapter 5) sering bisa menggantikan foreach untuk transformasi/filter data.
  4. Foreach tidak mereset pointer array — jika kamu butuh iterasi ulang, foreach akan mulai dari awal lagi secara otomatis.

Exercise

  1. Buat foreach untuk calculate total harga dari array produk
  2. Convert semua nama di array ke uppercase
  3. Buat array associative dan iterate untuk print dalam format "KEY: VALUE"
  4. Kenapa perlu unset($num) setelah foreach dengan reference?
  5. Buat array multidimensi berisi 3 mahasiswa (nama + nilai), lalu tampilkan siapa yang lulus (nilai >= 75)
  6. Buat foreach yang menghitung berapa kali huruf vokal muncul dalam array kata

Summary

PoinPenjelasan
Syntax dasarforeach ($array as $value)
Dengan keyforeach ($array as $key => $value)
Nilai defaultSalinan (copy) — tidak mengubah array asli
Modifikasi arrayPakai & reference + unset() setelahnya
Array multidimensiNested foreach
ObjectBisa di-foreach untuk iterasi property
Kapan dipakaiHampir semua iterasi array
Common mistakeUbah array saat iterate, lupa unset reference

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 4

Uji pemahamanmu tentang Perulangan (Loops)