Perulangan foreach adalah cara utama mengunjungi setiap elemen array pada PHP. Topik ini membahas bentuk foreach dengan kunci dan nilai, pengubahan nilai lewat referensi, perilaku perulangan ketika elemen ditambahkan atau dihapus di tengah iterasi, serta perulangan for pada array terindeks. Setelah membacanya, setiap elemen array dapat dikunjungi dan diubah dengan perilaku yang terduga.
foreach dengan kunci dan nilai#
foreach mengulang blok kode untuk setiap elemen array mengikuti urutan penyisipannya. Bentuk pertama hanya mengambil nilai, yaitu foreach ($nilaiUjian as $nilai). Bentuk kedua mengambil kunci sekaligus nilai, yaitu foreach ($nilaiUjian as $nama => $nilai), sehingga label kunci dapat dipakai di dalam bloknya. Kedua bentuk bekerja pada array terindeks maupun array asosiatif tanpa perubahan kode apa pun.
Variabel nilai di dalam blok merupakan salinan nilai elemen, bukan elemennya sendiri, sehingga penugasan padanya tidak mengubah array asal. Cara mengubah nilai array dari dalam perulangan dibahas pada bagian berikutnya.
Contoh berikut mencetak daftar nilai ujian bersama nama siswanya, lalu menjumlahkan seluruh nilai dengan perulangan kedua yang hanya mengambil nilai.
<?php
$nilaiUjian = [
'Ali' => 78,
'Budi' => 85,
'Citra' => 91,
];
foreach ($nilaiUjian as $nama => $nilai) {
echo "$nama: $nilai\n";
}
$total = 0;
foreach ($nilaiUjian as $nilai) {
$total += $nilai;
}
echo "total: $total\n";Ali: 78
Budi: 85
Citra: 91
total: 254Perulangan pertama memakai bentuk kunci dan nilai agar nama siswa ikut tercetak, sedangkan perulangan kedua cukup memakai bentuk nilai karena kuncinya tidak diperlukan. Keduanya mengunjungi elemen dalam urutan yang sama, yaitu urutan penyisipan array $nilaiUjian.
Mengubah nilai lewat referensi#
Tanda & pada foreach ($nilai as &$angka) membuat $angka menjadi referensi ke elemen array, sehingga penugasan padanya mengubah array asal secara langsung. Bentuk ini lazim dipakai untuk mengubah seluruh nilai tanpa menuliskan indeks. Setelah perulangan berakhir, variabel referensi masih terhubung ke elemen terakhir, sehingga variabel tersebut wajib dilepas dengan unset() sebelum dipakai untuk keperluan lain.
Contoh berikut menambahkan lima poin pada setiap nilai ujian lewat referensi, lalu melepas variabel referensinya.
<?php
$nilai = [70, 80, 90];
foreach ($nilai as &$angka) {
$angka = $angka + 5;
}
unset($angka);
print_r($nilai);Array
(
[0] => 75
[1] => 85
[2] => 95
)Setiap elemen bertambah lima karena penugasan pada $angka ditujukan langsung ke elemen array, dan unset($angka) memutus hubungan referensi setelah perulangan selesai.
Menambah dan menghapus saat iterasi#
Perulangan foreach versi nilai mengiterasi salinan array, bukan array itu sendiri. Akibatnya, elemen yang ditambahkan di dalam blok tidak masuk daftar kunjungan, sedangkan penghapusan elemen pada array asal tidak menghentikan kunjungan atas elemen yang sudah ada di dalam salinan. Perilaku ini membuat foreach aman dipakai untuk membaca array yang sedang dimodifikasi, tetapi hasil modifikasinya baru terlihat pada perulangan berikutnya.
Contoh berikut menambahkan satu elemen baru untuk setiap elemen yang dikunjungi, lalu mencetak array setelah perulangan selesai.
<?php
$harga = ['buku' => 5000, 'pulpen' => 2000];
foreach ($harga as $nama => $nilai) {
$harga[$nama . '-potongan'] = $nilai - 500;
echo "$nama: $nilai\n";
}
print_r($harga);buku: 5000
pulpen: 2000
Array
(
[buku] => 5000
[pulpen] => 2000
[buku-potongan] => 4500
[pulpen-potongan] => 1500
)Perulangan hanya mencetak buku dan pulpen meskipun dua elemen baru ditambahkan di dalam bloknya, karena daftar kunjungan sudah ditetapkan dari salinan array di awal. Apabila elemen baru perlu dikunjungi juga, tuliskan perulangan kedua atau kumpulkan datanya pada array lain terlebih dahulu.
Penghapusan elemen di tengah perulangan mengikuti logika yang sama, tetapi pola yang lebih bersih adalah mengumpulkan kunci yang ingin dihapus pada satu array, lalu menghapusnya lewat unset() setelah perulangan selesai. Pola ini memisahkan keputusan dari aksinya, sehingga array yang dihasilkan dapat diperiksa lewat print_r() tanpa menelusuri perilaku perulangannya. Alternatif lainnya menyerahkan penyaringan kepada array_filter() yang membentuk array hasil baru.
Perulangan for pada array terindeks#
Perulangan for cocok untuk array terindeks yang kuncinya berurutan tanpa lubang, karena indeksnya dikelola secara manual dengan batas count($nilai). Bentuk ini memungkinkan langkah melompat, misalnya membaca setiap elemen kedua, yang tidak dapat dilakukan foreach. Untuk array asosiatif, for tidak dapat dipakai karena kuncinya bukan bilangan berurutan, sehingga foreach tetap menjadi pilihan baku.
Contoh berikut membaca array terindeks dengan for beserta indeksnya.
<?php
$nilai = [78, 85, 91];
for ($i = 0; $i < count($nilai); $i++) {
echo "indeks $i: {$nilai[$i]}\n";
}indeks 0: 78
indeks 1: 85
indeks 2: 91Setiap baris keluaran memasangkan indeks dengan nilai pada kunci yang sama. Apabila salah satu elemen array ini pernah dihapus dengan unset(), perulangan for akan membaca kunci yang hilang dan memicu E_WARNING. Bentuk foreach lebih aman untuk array yang kuncinya tidak terjamin berurutan.
Kesalahan umum#
Kesalahan yang paling sering terjadi pada iterasi adalah membiarkan variabel referensi tetap terhubung setelah perulangan selesai. Contoh berikut menuliskan foreach referensi tanpa unset(), lalu menugaskan 99 ke $angka yang masih menjadi referensi elemen terakhir.
<?php
$nilai = [10, 20, 30];
foreach ($nilai as &$angka) {
// setiap elemen diproses di sini
}
$angka = 99;
print_r($nilai);Array
(
[0] => 10
[1] => 20
[2] => 99
)Nilai 99 menimpa elemen ketiga padahal array itu seharusnya tidak tersentuh lagi. Menuliskan unset($angka); tepat setelah perulangan memutus hubungan tersebut, sehingga penugasan berikutnya tidak lagi mengubah elemen array.
Kesalahan lain yang lazim dijumpai:
- Mengira penugasan pada variabel nilai mengubah array asal. Tanpa tanda
&, variabel nilai hanyalah salinan, sehingga pengubahan di dalam blok tidak berdampak apa pun. Gunakan bentuk referensi atau ubah elemen lewat kuncinya. - Mengharapkan elemen yang ditambahkan di tengah
foreachikut dikunjungi. Perulangan versi nilai mengiterasi salinan array, sehingga elemen baru tidak masuk daftar kunjungan. Kumpulkan data pada array lain atau lakukan perulangan kedua. - Menghapus elemen yang belum dikunjungi dan mengira kunjungannya ikut batal. Salinan yang diiterasi tetap memuat elemen tersebut, sehingga blok tetap dieksekusi untuknya. Verifikasi logika penghapusan dengan mencetak array setelah perulangan.
Ringkasan#
foreachmengunjungi elemen menurut urutan penyisipan, dengan bentuk nilai saja maupun bentuk kunci dan nilai.- Tanda
&menjadikan variabel nilai sebagai referensi elemen, sehingga penugasan mengubah array asal dan variabelnya wajib dilepas denganunset(). - Perulangan versi nilai mengiterasi salinan array, sehingga elemen yang ditambahkan di dalam blok tidak dikunjungi.
- Perulangan
forcocok untuk array terindeks yang kuncinya berurutan, sedangkan array asosiatif tetap memakaiforeach.
Referensi#
- Perulangan foreach — Manual PHP — Menetapkan sintaks foreach, bentuk referensinya, dan catatan penggunaannya.
- count — Manual PHP — Menjelaskan penghitungan elemen array yang dipakai sebagai batas perulangan for.