5-4: Multidimensional Array
Objectives
- Memahami array dalam array (nested array)
- Akses dan manipulasi multidimensional array
- Mengenal 2D, 3D, dan mixed dimensions
- Menggunakan
array_column()danarray_chunk()untuk data bertingkat - Melihat common use cases: matrix, timetable, leaderboard
Apa itu Multidimensional Array?
Multidimensional array adalah array yang isinya array lagi. Kalau array biasa seperti deretan kotak, array 2 dimensi seperti papan catur — punya baris dan kolom. Setiap baris adalah array, dan kolom adalah index di dalam baris tersebut.
| Kolom 0 | Kolom 1 | Kolom 2 | |
|---|---|---|---|
| Baris 0 | [0][0] = 1 | [0][1] = 2 | [0][2] = 3 |
| Baris 1 | [1][0] = 4 | [1][1] = 5 | [1][2] = 6 |
| Baris 2 | [2][0] = 7 | [2][1] = 8 | [2][2] = 9 |
Baca $matrix[1][1] dari kiri ke kanan: "ambil baris index 1, lalu di dalamnya ambil kolom index 1". Setiap pasangan kurung siku menembus satu level lebih dalam.
2D Array
Contoh paling klasik: matrix 3x3. Operasi pada 2D array adalah kombinasi dari operasi array biasa — akses, ubah, dan loop bersarang.
<?php
// Matrix 3x3
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// Access
echo $matrix[0][0]; // Output: 1
echo $matrix[1][1]; // Output: 5
echo $matrix[2][2]; // Output: 9
// Modify
$matrix[1][1] = 10;
// Loop 2D array
foreach ($matrix as $row) {
foreach ($row as $cell) {
echo $cell . " ";
}
echo "\n";
}
// Output:
// 1 2 3
// 4 10 6
// 7 8 9
?>
Loop bersarang (nested loop) adalah cara standar menelusuri array 2D: loop luar berjalan per baris, loop dalam berjalan per sel.
Loop dengan Index Baris dan Kolom
<?php
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// Loop dengan index baris dan kolom
foreach ($matrix as $rowIndex => $row) {
foreach ($row as $colIndex => $cell) {
echo "matrix[$rowIndex][$colIndex] = $cell\n";
}
}
// Output:
// matrix[0][0] = 1
// matrix[0][1] = 2
// matrix[0][2] = 3
// matrix[1][0] = 4
// matrix[1][1] = 5
// matrix[1][2] = 6
// matrix[2][0] = 7
// matrix[2][1] = 8
// matrix[2][2] = 9
// Hitung total semua elemen
$total = 0;
foreach ($matrix as $row) {
$total += array_sum($row);
}
echo $total; // Output: 45
?>
array_sum($row) menjumlahkan semua elemen dalam satu baris. Untuk matrix, total keseluruhan = jumlah dari array_sum() setiap barisnya.
3D Array
3D array adalah array yang berisi array yang berisi array. Bayangkan kumpulan papan catur: dimensi pertama memilih papan, dimensi kedua memilih baris, dimensi ketiga memilih kolom.
<?php
$cuboid = [
[ // "Lapisan" 0
[1, 2], [3, 4]
],
[ // "Lapisan" 1
[5, 6], [7, 8]
]
];
// Access
echo $cuboid[0][1][0]; // Output: 3
// Baca: lapisan 0 -> baris 1 -> kolom 0
echo $cuboid[1][0][1]; // Output: 6
// Baca: lapisan 1 -> baris 0 -> kolom 1
// Loop 3D: tiga tingkat foreach
foreach ($cuboid as $layerIndex => $layer) {
echo "Lapisan $layerIndex:\n";
foreach ($layer as $row) {
foreach ($row as $cell) {
echo $cell . " ";
}
echo "\n";
}
}
// Output:
// Lapisan 0:
// 1 2
// 3 4
// Lapisan 1:
// 5 6
// 7 8
?>
Semakin dalam dimensinya, semakin rumit kodenya. Kalau kamu menemukan diri memakai 4D+ array, berhenti dan pikirkan ulang desainnya — biasanya data seperti itu lebih baik dipecah menjadi beberapa array 2D atau diganti dengan class.
Mixed Dimensions
Dimensi tidak harus seragam. Yang umum di dunia nyata: barisnya indexed array, tapi isinya associative array (seperti data dari database). Ini disebut array of associative arrays.
<?php
$products = [
["id" => 1, "name" => "Laptop", "price" => 12000000],
["id" => 2, "name" => "Mouse", "price" => 150000],
["id" => 3, "name" => "Keyboard", "price" => 350000]
];
// Akses: baris dulu, baru key
echo $products[0]["name"]; // Output: Laptop
echo $products[2]["price"]; // Output: 350000
// Ubah harga produk kedua
$products[1]["price"] = 140000;
// Tambah field baru untuk semua produk
foreach ($products as &$product) {
$product["in_stock"] = true;
}
unset($product); // penting: lepaskan reference
print_r($products[0]);
// Output:
// Array
// (
// [id] => 1
// [name] => Laptop
// [price] => 12000000
// [in_stock] => 1
// )
?>
Saat memakai foreach ($arr as &$item), selalu unset($item) setelah loop selesai. Tanpa itu, $item masih menjadi reference ke elemen terakhir — dan bisa merusak array saat dipakai lagi nanti. Ini bug klasik yang sulit dilacak.
Common Use Cases
Timetable (Jadwal)
<?php
$schedule = [
"Senin" => ["PHP", "JavaScript", "Database"],
"Selasa" => ["CSS", "HTML", "Project"],
"Rabu" => ["Laravel", "React", "Testing"]
];
foreach ($schedule as $day => $subjects) {
echo "$day: " . implode(", ", $subjects) . "\n";
}
// Output:
// Senin: PHP, JavaScript, Database
// Selasa: CSS, HTML, Project
// Rabu: Laravel, React, Testing
// Cek apakah hari tertentu punya mata pelajaran tertentu
if (in_array("Laravel", $schedule["Rabu"])) {
echo "Rabu ada Laravel"; // Output: Rabu ada Laravel
}
?>
Leaderboard
<?php
$leaderboard = [
["name" => "Andi", "score" => 1500],
["name" => "Budi", "score" => 1200],
["name" => "Citra", "score" => 1800]
];
// Sort by score descending
usort($leaderboard, function($a, $b) {
return $b["score"] <=> $a["score"];
});
foreach ($leaderboard as $rank => $player) {
echo ($rank + 1) . ". {$player['name']} - {$player['score']}\n";
}
// Output:
// 1. Citra - 1800
// 2. Andi - 1500
// 3. Budi - 1200
?>
Papan Permainan (Game Board)
<?php
// Papan Tic-Tac-Toe kosong, diisi "X" dan "O"
$board = [
["X", "O", "X"],
["O", "X", "O"],
["O", "X", "X"]
];
// Cek pemenang baris pertama
if ($board[0][0] === $board[0][1] && $board[0][1] === $board[0][2]) {
echo "Pemenang baris 1: " . $board[0][0];
}
// Tampilkan papan
foreach ($board as $row) {
echo implode(" | ", $row) . "\n";
}
// Output:
// X | O | X
// O | X | O
// O | X | X
?>
Function Pendukung untuk Data Bertingkat
array_column()
Mengambil satu kolom dari array of associative arrays — sangat umum untuk data database.
<?php
$users = [
["id" => 1, "name" => "Andi", "email" => "andi@mail.com"],
["id" => 2, "name" => "Budi", "email" => "budi@mail.com"],
["id" => 3, "name" => "Citra", "email" => "citra@mail.com"]
];
// Ambil semua email jadi satu array
$emails = array_column($users, "email");
print_r($emails);
// Output:
// Array
// (
// [0] => andi@mail.com
// [1] => budi@mail.com
// [2] => citra@mail.com
// )
// Gunakan kolom lain sebagai key hasilnya
$byId = array_column($users, "name", "id");
print_r($byId);
// Output:
// Array
// (
// [1] => Andi
// [2] => Budi
// [3] => Citra
// )
?>
array_chunk()
Memecah array besar menjadi potongan-potongan — berguna untuk pagination atau grid.
<?php
$items = [1, 2, 3, 4, 5, 6, 7, 8];
// Pecah jadi grup berisi 3
$chunks = array_chunk($items, 3);
print_r($chunks);
// Output:
// Array
// (
// [0] => Array ( [0] => 1 [1] => 2 [2] => 3 )
// [1] => Array ( [0] => 4 [1] => 5 [2] => 6 )
// [2] => Array ( [0] => 7 [1] => 8 )
// )
?>
array_column() wajib dikuasai kalau kamu bekerja dengan data dari database atau API — hampir semua data terstruktur berbentuk array of associative arrays, dan array_column() mengubahnya jadi daftar flat dalam satu baris.
Common Mistakes
| Mistake | Contoh Salah | Kenapa Salah | Solusi |
|---|---|---|---|
| Salah jumlah kurung siku | $matrix[1] padahal butuh $matrix[1][1] | Mendapatkan seluruh baris (array), bukan sel | Tambahkan kurung siku per level |
Lupa unset() setelah foreach by reference | foreach ($arr as &$item) tanpa unset | Reference tertinggal, data korup di loop berikutnya | unset($item) setelah loop |
| Mengira semua baris harus sama panjang | loop for dengan asumsi panjang tetap | Baris bisa beda panjang (jagged array) | Pakai foreach + count($row) |
| Memakai 3D+ tanpa perlu | struktur terlalu dalam | Kode susah dibaca dan di-debug | Pecah jadi beberapa array / class |
Lupa array_column untuk data DB | manual loop untuk ambil satu kolom | Kode panjang dan lambat | array_column($rows, "kolom") |
Exercise
- Buat matrix multiplication 2x2 (kalikan dua matrix)
- Buat gradebook: students x subjects dengan scores
- Hitung total dan average untuk setiap student
- Gunakan
array_column()untuk mengambil semua nama produk dari array products - Buat papan Tic-Tac-Toe 3x3 dan tulis function untuk mengecek apakah baris, kolom, atau diagonal ada yang penuh dengan simbol yang sama
- Gunakan
array_chunk()untuk membagi 10 item menjadi halaman berisi 4 item
Summary
| Konsep | Penjelasan |
|---|---|
| Multidimensional array | Array yang berisi array |
| 2D array | Seperti papan/matrix: baris dan kolom, akses $arr[r][c] |
| 3D array | Tiga tingkat, akses $arr[l][r][c] |
| Nested loop | foreach di dalam foreach untuk menelusuri array 2D |
| Array of associative arrays | Baris = indexed, isi = associative; bentuk data database/API |
array_column($rows, "col") | Ambil satu kolom menjadi array flat |
array_column($rows, "col", "keyCol") | Ambil kolom dengan key dari kolom lain |
array_chunk($arr, $n) | Pecah array menjadi potongan berisi $n |
usort($arr, $callback) | Urutkan array of arrays dengan aturan custom |
Reference &$item | Edit elemen di dalam foreach — wajib unset() setelahnya |
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 5
Uji pemahamanmu tentang Array