BAB 5: ARRAY

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() dan array_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 0Kolom 1Kolom 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
<?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
<?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

?>
💡Tip

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
<?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

?>
⚠️Perhatian

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
<?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
// )

?>
⚠️Perhatian

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
<?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
<?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
<?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
<?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
<?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 )
// )

?>
💡Tip

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

MistakeContoh SalahKenapa SalahSolusi
Salah jumlah kurung siku$matrix[1] padahal butuh $matrix[1][1]Mendapatkan seluruh baris (array), bukan selTambahkan kurung siku per level
Lupa unset() setelah foreach by referenceforeach ($arr as &$item) tanpa unsetReference tertinggal, data korup di loop berikutnyaunset($item) setelah loop
Mengira semua baris harus sama panjangloop for dengan asumsi panjang tetapBaris bisa beda panjang (jagged array)Pakai foreach + count($row)
Memakai 3D+ tanpa perlustruktur terlalu dalamKode susah dibaca dan di-debugPecah jadi beberapa array / class
Lupa array_column untuk data DBmanual loop untuk ambil satu kolomKode panjang dan lambatarray_column($rows, "kolom")

Exercise

  1. Buat matrix multiplication 2x2 (kalikan dua matrix)
  2. Buat gradebook: students x subjects dengan scores
  3. Hitung total dan average untuk setiap student
  4. Gunakan array_column() untuk mengambil semua nama produk dari array products
  5. Buat papan Tic-Tac-Toe 3x3 dan tulis function untuk mengecek apakah baris, kolom, atau diagonal ada yang penuh dengan simbol yang sama
  6. Gunakan array_chunk() untuk membagi 10 item menjadi halaman berisi 4 item

Summary

KonsepPenjelasan
Multidimensional arrayArray yang berisi array
2D arraySeperti papan/matrix: baris dan kolom, akses $arr[r][c]
3D arrayTiga tingkat, akses $arr[l][r][c]
Nested loopforeach di dalam foreach untuk menelusuri array 2D
Array of associative arraysBaris = 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 &$itemEdit elemen di dalam foreach — wajib unset() setelahnya

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 5

Uji pemahamanmu tentang Array