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".
<?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
$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
$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
$colors = ["Red", "Green", "Blue"];
foreach ($colors as $index => $color) {
echo "$index: $color\n";
}
/*
Output:
0: Red
1: Green
2: Blue
*/
?>
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
$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
$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]
?>
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
$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
$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
$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
$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
$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
$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";
}
?>
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
$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)
| Situasi | Pakai |
|---|---|
| Iterasi semua elemen array | foreach |
| Perlu index untuk operasi lain | foreach ($arr as $i => $v) |
| Perlu mengubah elemen array | foreach + & reference |
| Loop dengan step (misal tiap 2) | for |
| Loop mundur dari akhir array | for |
| Iterasi object/property | foreach |
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
- Selalu
unset()reference setelah foreach dengan&. - Jangan ubah array saat di-foreach — kumpulkan dulu, proses setelahnya.
array_map()danarray_filter()(dibahas di chapter 5) sering bisa menggantikan foreach untuk transformasi/filter data.- Foreach tidak mereset pointer array — jika kamu butuh iterasi ulang, foreach akan mulai dari awal lagi secara otomatis.
Exercise
- Buat foreach untuk calculate total harga dari array produk
- Convert semua nama di array ke uppercase
- Buat array associative dan iterate untuk print dalam format "KEY: VALUE"
- Kenapa perlu unset($num) setelah foreach dengan reference?
- Buat array multidimensi berisi 3 mahasiswa (nama + nilai), lalu tampilkan siapa yang lulus (nilai >= 75)
- Buat foreach yang menghitung berapa kali huruf vokal muncul dalam array kata
Summary
| Poin | Penjelasan |
|---|---|
| Syntax dasar | foreach ($array as $value) |
| Dengan key | foreach ($array as $key => $value) |
| Nilai default | Salinan (copy) — tidak mengubah array asli |
| Modifikasi array | Pakai & reference + unset() setelahnya |
| Array multidimensi | Nested foreach |
| Object | Bisa di-foreach untuk iterasi property |
| Kapan dipakai | Hampir semua iterasi array |
| Common mistake | Ubah array saat iterate, lupa unset reference |
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 4
Uji pemahamanmu tentang Perulangan (Loops)