foreach ($array as $value) menjalankan blok sekali untuk setiap elemen, dengan $value berisi elemen yang sedang diproses. Untuk mendapatkan key-nya juga, tulis foreach ($array as $key => $value).
foreach bekerja pada array apa pun, apa pun key-nya, dan kamu tidak perlu mengurus counter atau memeriksa panjang array. Inilah loop yang paling sering kamu tulis di PHP.
Perulangan atas key dan value
Di $key => $value, nama variabelnya bebas kamu pilih: $name => $age, $id => $user, $k => $v. Pada list, key-nya adalah posisi 0, 1, 2. Pada array asosiatif, key-nya adalah key string yang kamu tentukan.
Loop terakhir menunjukkan detail yang sering mengejutkan: key string yang terlihat seperti bilangan bulat, misalnya "1", disimpan sebagai integer 1. "01" bukan bentuk integer yang kanonis, jadi tetap menjadi string.
Mendapatkan indeks di foreach
Pada list, key-nya adalah indeks, jadi foreach ($items as $i => $item) sudah cukup. Pada array asosiatif tidak ada posisi berupa angka, jadi buat counter sendiri. Untuk memperlakukan elemen pertama atau terakhir secara berbeda, bandingkan key dengan array_key_first() atau array_key_last().
Loop terakhir mencetak koma di antara nama, tetapi tidak setelah nama terakhir. Untuk tugas persis seperti itu, implode(', ', array_keys($scores)) lebih singkat; pemeriksaan array_key_last() gunanya saat putaran terakhir butuh logika yang berbeda, bukan sekadar pemisah yang berbeda.
Mengubah nilai array di foreach (lewat referensi)
$value adalah salinan. Memberi nilai baru padanya tidak mengubah apa pun di array. Untuk mengubah array, lakukan perulangan lewat referensi dengan &$value, atau tulis kembali lewat key.
Keduanya berfungsi. Versi dengan key tidak meninggalkan state tersembunyi setelah loop selesai, itulah sebabnya banyak tim lebih menyukainya. Untuk membuat array baru alih-alih mengubah yang lama, array_map() adalah pilihan lain.
Pertanyaan yang berkaitan: apa yang terjadi jika kamu menambah elemen selama perulangan? foreach biasa menelusuri array seperti saat loop dimulai, jadi $prices[] = ... di dalamnya tidak menambah putaran. Loop lewat referensi menelusuri array yang hidup dan ikut mengunjungi elemen baru.
Jebakan unset() pada foreach lewat referensi
Setelah foreach ($arr as &$v), variabel $v masih menjadi referensi ke elemen terakhir array. Jika nanti kamu memakai lagi nama $v di loop biasa, setiap putaran menulis ke elemen terakhir itu. Jalankan kode ini dan lihat item terakhirnya:
Loop kedua memberi nilai A, lalu B, lalu nilai milik elemen terakhir itu sendiri ke $letters[2], dan pada putaran terakhir slot itu sudah berisi B. Perbaikannya cuma satu baris: tulis unset($v); tepat setelah setiap foreach lewat referensi.
break dan continue di foreach
break keluar dari loop, continue melompat ke elemen berikutnya. Pola yang umum adalah pencarian: lakukan perulangan sampai kamu menemukan yang dicari, lalu break agar sisa array tidak diperiksa.
Di loop bersarang, break 2 keluar dari loop dalam dan loop yang membungkusnya, dan continue 2 melompat ke putaran berikutnya dari loop luar.
Array bersarang dan foreach dengan list()
Baris-baris data adalah array di dalam array. Lakukan perulangan atas barisnya, lalu atas setiap baris, atau ambil field-nya langsung di baris foreach dengan array destructuring: [$a, $b] untuk list, ['key' => $var] untuk baris asosiatif. list($a, $b) adalah cara penulisan lama untuk [$a, $b].
Halaman destructuring membahas lebih banyak tentang sintaks [...] =, termasuk elemen yang dilewati dan pola bersarang.
Membuat list atau tabel HTML dengan foreach
Di template, bentuk titik dua foreach (...): dengan endforeach; membuat loop tetap mudah dibaca di antara tag. Blok ini membuat tabel, dan judul kolomnya berupa link: klik salah satunya di tab Halaman, maka script yang sama berjalan lagi dengan $_GET['sort'] terisi, sehingga baris-barisnya muncul dengan urutan baru.
Dua kebiasaan yang layak ditiru dari blok ini: nilai sort dari URL diperiksa terhadap daftar kolom yang diizinkan sebelum dipakai, dan setiap nilai yang dicetak ke HTML dan bisa berisi teks dari pengguna melewati htmlspecialchars().
foreach atas null, array kosong, atau object
Array kosong tidak masalah: body-nya tidak pernah dijalankan. null, string, atau angka bermasalah: PHP mencetak warning dan melewati loop. Untuk $tags = null; foreach ($tags as $tag), outputnya:
Warning: foreach() argument must be of type array|object, null given in /var/www/html/index.php on line 4
Ini paling sering terjadi pada data yang kadang tidak ada, seperti field opsional di JSON yang sudah di-decode. Gunakan array kosong sebagai cadangan dengan ??:
foreach ($data['tags'] ?? [] as $tag) {
echo $tag;
}
Kata object dalam pesan itu memang benar: foreach atas object mengunjungi property yang terlihat dari tempat loop dijalankan (di luar class, berarti yang public), dengan nama property sebagai key. Class yang mengimplementasikan Iterator atau IteratorAggregate, serta generator, menentukan sendiri apa yang dilihat oleh foreach.
foreach vs for vs array_map
| Pakai | Kapan |
|---|---|
foreach | Kamu butuh setiap elemen, dengan atau tanpa key-nya. Berfungsi pada array apa pun, list maupun asosiatif. |
for | Kamu menghitung (1 sampai 100, setiap elemen kedua) atau butuh elemen tetangga lewat indeks ($a[$i - 1]). Lihat for loop. |
array_map() | Kamu membuat array baru dengan mengubah setiap elemen, sering kali dalam satu baris dengan fn. |
array_filter() | Kamu hanya menyimpan elemen yang lolos sebuah pengujian. |
Cara cepat untuk memutuskan: jika body loop hanya menghitung nilai baru untuk setiap elemen, array_map(fn($x) => $x * 2, $a) mengatakannya dalam satu baris. Jika ada efek samping (mencetak, menyimpan, menghitung beberapa hal sekaligus) atau butuh break, tulis foreach.
Pertanyaan yang sering diajukan
Bagaimana cara mendapatkan key dan value di loop foreach PHP?
Pakai bentuk =>: foreach ($array as $key => $value) { echo "$key: $value"; }. Pada list biasa, key-nya adalah indeks (0, 1, 2); pada array asosiatif, key-nya adalah key string, misalnya 'name'.
Bagaimana cara mendapatkan indeks di loop foreach PHP?
Pada list, key sudah berupa indeks: foreach ($items as $i => $item). Pada array asosiatif, buat counter sendiri: tulis $i = 0; sebelum loop dan $i++ di akhir setiap putaran. array_key_first() dan array_key_last() memberi tahu key mana yang pertama atau terakhir.
Bagaimana cara mengubah nilai array di dalam foreach PHP?
Lakukan perulangan lewat referensi dengan &: foreach ($prices as &$price) { $price *= 2; } unset($price);. Atau tulis lewat key: foreach ($prices as $key => $price) { $prices[$key] = $price * 2; }. $price = ... biasa hanya mengubah salinannya.
Kenapa foreach PHP lewat referensi menggandakan elemen terakhir?
Setelah foreach ($arr as &$v), $v masih menjadi referensi ke elemen terakhir. foreach ($arr as $v) kedua lalu menulis setiap nilai ke slot terakhir itu, sehingga isinya berakhir dengan mengulang nilai kedua dari belakang. Panggil unset($v); tepat setelah loop referensi.
Bagaimana cara keluar dari loop foreach di PHP?
break; menghentikan loop saat itu juga dan continue; melompat ke elemen berikutnya. Di loop bersarang, break 2; keluar dari loop dalam sekaligus loop luar.