Hampir semua logika aplikasi berpori pada satu aktivitas: menjelajahi isi array baris demi baris — menampilkan daftar produk, menggabungkan nilai, atau menyandingkan dua kumpulan data. PHP menyediakan lebih dari satu cara untuk itu, dan masing-masing punya tempatnya: foreach untuk kasus umum, for saat indeks perlu dimanipulasi, array_walk untuk mutasi ringkas, hingga iterator dan generator untuk koleksi berbasis object. Chapter ini memetakan alat-alat tersebut beserta panduan kapan memakainya.

Menjelajah Isi dengan foreach #

foreach adalah alat iterasi bawaan yang paling sering dipakai karena membaca array apa adanya — tanpa Anda mengelola indeks manual, dan tetap benar untuk array dengan kunci string maupun numerik:

php
<?php
$buah = ['Apel', 'Jeruk', 'Mangga'];
foreach ($buah as $item) {
    echo "- $item\n";
}

$stok = ['apel' => 10, 'jeruk' => 8, 'mangga' => 12];
foreach ($stok as $nama => $jumlah) {
    echo "$nama: $jumlah\n";
}

Output yang Dihasilkan:

text
- Apel
- Jeruk
- Mangga
apel: 10
jeruk: 8
mangga: 12

Loop pertama memakai bentuk nilai: setiap elemen disalin ke $item satu per satu. Loop kedua memakai bentuk kunci => nilai sehingga $nama berisi kunci string dan $jumlah berisi nilainya. Perlu mengubah elemen asli dari dalam loop? Tambahkan & sebelum variabel nilai — perilaku, manfaat, dan jebakannya sudah kita bedah tuntas di Chapter Array Copy dan References .

Loop for dan Manipulasi Indeks #

for unggul ketika posisi indeksnya sendiri yang Anda olah: melompat dua langkah, membaca elemen tetangga, atau berjalan mundur. Satu kebiasaan penting: simpan hasil count() ke variabel sebelum loop dimulai:

php
<?php
$buah = ['Apel', 'Jeruk', 'Mangga', 'Pisang', 'Anggur'];

for ($i = 0, $n = count($buah); $i < $n; $i += 2) {
    echo ($i + 1) . '. ' . $buah[$i] . "\n";
}

Output yang Dihasilkan:

text
1. Apel
3. Mangga
5. Anggur

Ekspresi awal for mengevaluasi count($buah) sekali dan menyimpannya ke $n, lalu kondisi tinggal membandingkan dua angka. Langkah $i += 2 membuat loop hanya menyentuh elemen bernomor ganjil manusia: Apel, Mangga, Anggur. Loop ini juga hanya cocok untuk array berindeks numerik berurutan — bila kuncinya string atau bolong, foreach tetap pilihan yang benar.

Mengubah Elemen dengan array_walk #

array_walk menjalankan sebuah callback untuk setiap elemen dan — berbeda dari array_map — bekerja langsung pada array aslinya lewat parameter reference:

php
<?php
$nama = ['budi', 'siti', 'andi'];

array_walk($nama, function (string &$value, int|string $key): void {
    $value = ucfirst($value);
});

print_r($nama);

Output yang Dihasilkan:

text
Array
(
    [0] => Budi
    [1] => Siti
    [2] => Andi
)

Callback menerima dua parameter: &$value sebagai reference ke elemen dan $key sebagai kuncinya. Di dalam callback, ucfirst() mengubah huruf pertama setiap nama menjadi kapital, dan hasilnya langsung tertulis ke $nama — tidak ada array baru yang dikembalikan. Gunakan array_walk untuk efek samping ringkas seperti ini; gunakan array_map saat Anda menginginkan array hasil sebagai nilai kembali (bandingkan keduanya di Chapter array_map, array_filter, dan array_reduce ).

Mengiterasi Dua Array Sekaligus #

Kebutuhan klasik: menyandingkan dua array sejajar — nama siswa dan nilainya. Cara tradisional memakai loop indeks:

php
<?php
$namaSiswa = ['Budi', 'Siti', 'Andi'];
$nilaiSiswa = [80, 95, 70];

$jumlah = count($namaSiswa);
for ($i = 0; $i < $jumlah; $i++) {
    echo $namaSiswa[$i] . ': ' . $nilaiSiswa[$i] . "\n";
}

Output yang Dihasilkan:

text
Budi: 80
Siti: 95
Andi: 70

Loop ini membaca elemen ke-$i dari masing-masing array pada setiap putaran. Alternatif yang lebih deklaratif memakai array_map dengan callback dua parameter — atau array_map(null, ...) bila hasil berupa pasangan yang ingin diolah lebih lanjut:

php
<?php
$namaSiswa = ['Budi', 'Siti', 'Andi'];
$nilaiSiswa = [80, 95, 70];

$gabungan = array_map(
    fn (string $n, int $v): string => "$n=$v",
    $namaSiswa,
    $nilaiSiswa
);
print_r($gabungan);

Output yang Dihasilkan:

text
Array
(
    [0] => Budi=80
    [1] => Siti=95
    [2] => Andi=70
)

Kedua cara menghasilkan pasangan yang sama; pilih loop indeks bila Anda perlu kontrol penuh atas posisi, dan pilih array_map bila hasil akhirnya memang array baru. Ingat batasan yang sudah dibahas sebelumnya: callback array_map multi-array tidak menjamin kunci asli dan mengisi null untuk array yang lebih pendek.

Iterator: Koleksi Berbasis Object #

Array bukan satu-satunya hal yang bisa di-foreach. Object yang mengimplementasikan interface IteratorAggregate cukup menyediakan iterator lewat getIterator(), dan foreach bisa menjelajahinya seperti array biasa:

php
<?php
class KoleksiHari implements IteratorAggregate
{
    public function __construct(private array $hari) {}

    public function getIterator(): ArrayIterator
    {
        return new ArrayIterator($this->hari);
    }
}

$koleksi = new KoleksiHari(['Senin', 'Selasa', 'Rabu']);
foreach ($koleksi as $hari) {
    echo $hari . "\n";
}

Output yang Dihasilkan:

text
Senin
Selasa
Rabu

Dua konsep OOP dipakai di sini: private array $hari pada constructor adalah constructor property promotion — cara singkat mendeklarasikan sekaligus mengisi properti — dan ArrayIterator adalah iterator bawaan SPL yang membungkus array. Manfaat pola ini adalah enkapsulasi: pemanggil bisa mengiterasi isi koleksi tanpa memegang array mentahnya, dan Anda bebas mengganti cara penyimpanan data di dalam class tanpa memutus kode pemanggil. Pembahasan mendalam tentang Iterator, IteratorAggregate, dan kerabatnya menanti di Section Advanced Object Model .

Pratinjau Generator #

Varian lain yang layak dikenali sejak dini adalah generator: function berkata kunci yield yang menghasilkan nilai satu per satu hanya saat diminta:

php
<?php
function buatAlfabet(int $jumlah): Generator
{
    for ($i = 0; $i < $jumlah; $i++) {
        yield chr(65 + $i);
    }
}

foreach (buatAlfabet(3) as $huruf) {
    echo $huruf . "\n";
}

print_r(iterator_to_array(buatAlfabet(3)));

Output yang Dihasilkan:

text
A
B
C
Array
(
    [0] => A
    [1] => B
    [2] => C
)

yield menyerahkan satu nilai ke loop lalu menjeda function sampai nilai berikutnya diminta — tidak ada array yang dibangun di memori sekaligus. Fungsi iterator_to_array() menutup contoh dengan mengubah iterator apa pun (termasuk hasil generator) kembali menjadi array. Generator sungguhan — termasuk alasan hemat memorinya — dibahas khusus di Chapter Generators .

Panduan Memilih Alat Iterasi #

KebutuhanAlat yang tepat
Menjelajahi semua elemen apa adanyaforeach
Mengubah elemen array asli secara ringkasarray_walk
Memanipulasi indeks, langkah, atau arah loopfor
Menyandingkan beberapa array menjadi array baruarray_map
Koleksi milik class yang perlu enkapsulasiIteratorAggregate + ArrayIterator
Rangkaian nilai besar yang dihitung malasgenerator (yield)

Ringkasan #

foreach tetap pilihan default untuk hampir semua iterasi; for dan array_walk mengisi ceruk manipulasi indeks dan mutasi ringkas; iterator menjadikan koleksi berorientasi object; generator menghitung nilai secara malas. Dengan semua alat loop ini di tangan, chapter berikutnya merangkum fungsi-fungsi array praktis sehari-hari yang belum sempat kita singgahi satu per satu — dari compact() sampai array_is_list().

Referensi #