Data di dunia nyata jarang berbentuk daftar datar. Seorang siswa memiliki nilai untuk beberapa mata pelajaran; sebuah produk memiliki nama, harga, dan stok sekaligus; sebuah papan catur memiliki 8 baris yang masing-masing berisi 8 kolom. Array satu tingkat yang kita pelajari sejauh ini hanya sanggup menyimpan satu deret nilai. Multidimensional array menjawab kebutuhan berlapis tersebut: array yang nilainya adalah array lain. Pada Chapter ini kita akan mempelajari cara mengakses elemen bertingkat, menyusun matriks, memodelkan data bergaya tabel, dan menelusuri seluruh isinya dengan perulangan bersarang.

Array di Dalam Array #

Tidak ada sintaks khusus untuk membuat array multidimensi — kita cukup menulis array sebagai nilai dari elemen array lain, dan PHP mengevaluasi rangkaian indeks dari kiri ke kanan:

php
<?php
$mahasiswa = [
    "nama" => "Budi Santoso",
    "nilai" => [
        "matematika" => 85,
        "fisika" => 78,
        "kimia" => 92,
    ],
];

echo "Nama: " . $mahasiswa["nama"] . "\n";
echo "Nilai fisika: " . $mahasiswa["nilai"]["fisika"] . "\n";
echo "Nilai kimia: " . $mahasiswa["nilai"]["kimia"] . "\n";

Output yang Dihasilkan:

text
Nama: Budi Santoso
Nilai fisika: 78
Nilai kimia: 92

Mari kita telaah baris-baris kode di atas:

  1. Baris 2-10 ($mahasiswa = [...]): array terluar memiliki dua kunci — "nama" bernilai string, dan "nilai" bernilai array lain yang berisi tiga pasangan kunci-nilai.
  2. Baris 12 (echo $mahasiswa["nama"]): pembacaan satu tingkat, sama seperti associative array biasa.
  3. Baris 13 ($mahasiswa["nilai"]["fisika"]): PHP lebih dulu mengambil array di bawah kunci "nilai", lalu dari array tersebut mengambil nilai di bawah kunci "fisika" — hasilnya 78.

Membaca Struktur Bersarang dengan print_r #

Semakin dalam strukturnya, semakin sulit membayangkan isinya hanya dari kode. Fungsi print_r() menyelamatkan kita dengan menampilkan seluruh isi bertingkat beserta indentasi yang menunjukkan kedalaman:

php
<?php
$rapor = [
    "Budi" => [
        "matematika" => 85,
        "fisika" => 78,
    ],
    "Siti" => [
        "matematika" => 92,
        "fisika" => 88,
    ],
];

print_r($rapor);

Output yang Dihasilkan:

text
Array
(
    [Budi] => Array
        (
            [matematika] => 85
            [fisika] => 78
        )

    [Siti] => Array
        (
            [matematika] => 92
            [fisika] => 88
        )

)

Bacaan output-nya lurus: array terluar memiliki dua kunci, [Budi] dan [Siti], dan keduanya dipetakan ke Array yang dicetak dengan indentasi lebih dalam. Setiap array dalam dicetak dengan tanda kurung buka-tutupnya sendiri beserta seluruh pasangan [kunci] => nilai di dalamnya; satu baris kosong setelah kurung tutup menandai berakhirnya satu elemen array terluar. Dari struktur ini terlihat jelas bahwa $rapor adalah data dua siswa yang masing-masing memiliki dua nilai mata pelajaran.

Matriks: Array Dua Dimensi #

Bentuk klasik array multidimensi adalah matriks — array terindeks yang berisi array terindeks lain. Kita mengakses isinya dengan konvensi [baris][kolom]:

php
<?php
$matriks = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];

echo $matriks[0][0] . "\n";
echo $matriks[1][2] . "\n";
echo $matriks[2][1] . "\n";

$total = $matriks[0][1] + $matriks[2][0];
echo "Hasil penjumlahan: $total\n";

Output yang Dihasilkan:

text
1
6
8
Hasil penjumlahan: 9

Mari kita bedah akses-aksesnya terhadap isi matriks:

  1. $matriks[0][0] menghasilkan 1 — baris pertama (indeks 0), kolom pertama (indeks 0).
  2. $matriks[1][2] menghasilkan 6 — baris kedua, kolom ketiga, yaitu elemen terakhir pada [4, 5, 6].
  3. $matriks[2][1] menghasilkan 8 — baris ketiga, kolom kedua.
  4. $total menjumlahkan 2 (baris pertama kolom kedua) dengan 7 (baris ketiga kolom pertama) menjadi 9 — bukti bahwa elemen hasil akses bertingkat adalah integer biasa yang bisa dihitung langsung.

Ingat selalu bahwa kedua indeks sama-sama berbasis nol, sehingga [1][2] berarti “baris kedua, kolom ketiga”. Kekeliruan menganggap [1] sebagai baris pertama adalah kecelakaan klasik saat bekerja dengan matriks.

Data Gaya Tabel: Daftar Produk #

Pola paling sering dipakai di aplikasi nyata adalah daftar record: array terindeks di luar, associative array di dalam. Setiap elemen terluar merepresentasikan satu baris tabel, dan kunci string di dalamnya berperan sebagai nama kolom:

php
<?php
$produk = [
    ["nama" => "Kopi Gayo", "harga" => 85000],
    ["nama" => "Teh Melati", "harga" => 45000],
    ["nama" => "Gula Aren", "harga" => 30000],
];

foreach ($produk as $item) {
    echo $item["nama"] . ": Rp" . $item["harga"] . "\n";
}

Output yang Dihasilkan:

text
Kopi Gayo: Rp85000
Teh Melati: Rp45000
Gula Aren: Rp30000

Perulangan foreach yang sudah kita kenal dari Chapter Foreach Loops menelusuri array terluar sebanyak tiga kali. Pada setiap putaran, variabel $item berisi satu associative array utuh — misalnya ["nama" => "Teh Melati", "harga" => 45000] — yang kemudian dibaca per kolomnya melalui $item["nama"] dan $item["harga"]. Pola ini persis seperti membaca tabel: satu baris demi satu baris, lalu kolom demi kolom.

Iterasi Array Bersarang #

Untuk menelusuri seluruh elemen array dua dimensi, kita membutuhkan perulangan bersarang: perulangan luar berjalan per baris, perulangan dalam berjalan per elemen pada baris tersebut:

php
<?php
$matriks = [
    [1, 2, 3],
    [4, 5, 6],
];

foreach ($matriks as $baris) {
    echo implode(" ", $baris) . "\n";
}

Output yang Dihasilkan:

text
1 2 3
4 5 6

Perulangan luar berjalan dua kali — sekali untuk [1, 2, 3] dan sekali untuk [4, 5, 6]. Di dalamnya, implode(" ", $baris) menggabungkan elemen baris menjadi satu string dengan pemisah spasi — fungsi yang sudah kita kenal dari Chapter Splitting dan Joining . Hasilnya, setiap baris matriks tercetak pada satu baris output. Bentuk foreach di dalam foreach juga sah bila kita perlu memproses tiap sel satu per satu.

Studi kasus kecil berikut merangkum semuanya: menghitung total belanja dari keranjang berisi beberapa item, masing-masing dengan harga dan jumlah:

php
<?php
$keranjang = [
    ["nama" => "Kopi Gayo", "harga" => 85000, "jumlah" => 2],
    ["nama" => "Gula Aren", "harga" => 30000, "jumlah" => 1],
];

$totalBelanja = 0;
foreach ($keranjang as $item) {
    $subtotal = $item["harga"] * $item["jumlah"];
    echo $item["nama"] . ": Rp" . $subtotal . "\n";
    $totalBelanja += $subtotal;
}

echo "Total belanja: Rp" . $totalBelanja . "\n";

Output yang Dihasilkan:

text
Kopi Gayo: Rp170000
Gula Aren: Rp30000
Total belanja: Rp200000

Alurnya bekerja seperti kasir sungguhan. Sebelum perulangan, $totalBelanja disiapkan bernilai 0 sebagai titik awal penjumlahan. Pada setiap putaran, $subtotal dihitung dari kolom "harga" dikali kolom "jumlah" — 85000 × 2 menghasilkan 170000, lalu 30000 × 1 menghasilkan 30000 — dan hasilnya sekaligus dicetak serta ditambahkan ke $totalBelanja melalui operator +=. Setelah perulangan selesai, total 200000 tercetak sebagai baris penutup. Inilah pola akumulator: array bersarang menyediakan data, perulangan mengolahnya baris demi baris, dan satu variabel mengumpulkan hasilnya.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh di atas dalam satu program utuh yang dapat Anda unduh dan jalankan langsung.

Ringkasan #

Multidimensional array hanyalah array yang berisi array — diakses bertingkat dari kiri ke kanan seperti $matriks[1][2] atau $mahasiswa["nilai"]["fisika"]. Kita telah menyusun matriks, memodelkan daftar record bergaya tabel, dan menelusuri isi bertingkat dengan foreach bersarang hingga menghitung total belanja. Sejauh ini kita selalu menulis isi array secara harfiah satu per satu; pada Chapter berikutnya kita akan mempelajari cara membangun array dari berbagai sumber — rentang angka, pengisian massal, hingga string yang dipecah.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php

// Contoh 1: akses bertingkat pada array bersarang
$mahasiswa = [
    "nama" => "Budi Santoso",
    "nilai" => [
        "matematika" => 85,
        "fisika" => 78,
        "kimia" => 92,
    ],
];

echo "Nama: " . $mahasiswa["nama"] . "\n";
echo "Nilai fisika: " . $mahasiswa["nilai"]["fisika"] . "\n";
echo "Nilai kimia: " . $mahasiswa["nilai"]["kimia"] . "\n";

// Contoh 2: melihat struktur bersarang dengan print_r
$rapor = [
    "Budi" => [
        "matematika" => 85,
        "fisika" => 78,
    ],
    "Siti" => [
        "matematika" => 92,
        "fisika" => 88,
    ],
];

print_r($rapor);

// Contoh 3: matriks dan akses [baris][kolom]
$matriks = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];

echo $matriks[0][0] . "\n";
echo $matriks[1][2] . "\n";
echo $matriks[2][1] . "\n";

$total = $matriks[0][1] + $matriks[2][0];
echo "Hasil penjumlahan: $total\n";

// Contoh 4: daftar produk bergaya tabel
$produk = [
    ["nama" => "Kopi Gayo", "harga" => 85000],
    ["nama" => "Teh Melati", "harga" => 45000],
    ["nama" => "Gula Aren", "harga" => 30000],
];

foreach ($produk as $item) {
    echo $item["nama"] . ": Rp" . $item["harga"] . "\n";
}

// Contoh 5: iterasi bersarang untuk mencetak matriks
$matriks = [
    [1, 2, 3],
    [4, 5, 6],
];

foreach ($matriks as $baris) {
    echo implode(" ", $baris) . "\n";
}

// Contoh 6: studi kasus menghitung total belanja
$keranjang = [
    ["nama" => "Kopi Gayo", "harga" => 85000, "jumlah" => 2],
    ["nama" => "Gula Aren", "harga" => 30000, "jumlah" => 1],
];

$totalBelanja = 0;
foreach ($keranjang as $item) {
    $subtotal = $item["harga"] * $item["jumlah"];
    echo $item["nama"] . ": Rp" . $subtotal . "\n";
    $totalBelanja += $subtotal;
}

echo "Total belanja: Rp" . $totalBelanja . "\n";