BAB 5: ARRAY

5-3: Associative Array

Objectives

  • Memahami associative array secara mendalam
  • Melakukan operasi CRUD pada associative array
  • Menggunakan array dengan key yang meaningful
  • Menggabungkan associative array dengan array_merge() dan operator +
  • Mengenal use case nyata: config, form data, dan HTTP headers

Deep Dive Associative Array

Associative array adalah array yang key-nya berupa string, bukan angka. Alih-alih "elemen ke-3", kita bicara "elemen dengan key email". Ini membuat kode terbaca seperti kalimat: $user["email"] — jelas maksudnya.

php
$user = [
    "first_name" => "Andi",
    "last_name"  => "Pratama",
    "email"      => "andi@example.com",
    "age"        => 25,
    "is_active"  => true,
];

Secara visual:

KeyValue
first_name"Andi"
last_name"Pratama"
email"andi@example.com"
age25
is_activetrue

Setiap pasangan "key" => "value" dipisahkan koma, dan urutannya dipertahankan oleh PHP — array tidak otomatis diurutkan berdasarkan key atau value.

Operasi CRUD

CRUD singkatan dari Create, Read, Update, Delete — empat operasi dasar yang bisa dilakukan pada associative array.

php
<?php

// CREATE: buat array dengan data awal
$user = [
    "first_name" => "Andi",
    "last_name" => "Pratama",
    "email" => "andi@example.com",
    "age" => 25,
    "is_active" => true
];

// READ: akses berdasarkan key
echo $user["first_name"];  // Output: Andi

// UPDATE: timpa nilai pada key yang sudah ada
$user["age"] = 26;
echo $user["age"];  // Output: 26

// CREATE: tambah key baru (key belum ada = create)
$user["city"] = "Jakarta";
echo $user["city"];  // Output: Jakarta

// DELETE: hapus key
unset($user["is_active"]);
var_dump(isset($user["is_active"]));  // Output: bool(false)

print_r($user);
// Output:
// Array
// (
//     [first_name] => Andi
//     [last_name] => Pratama
//     [email] => andi@example.com
//     [age] => 26
//     [city] => Jakarta
// )

?>
💡Tip

Aturan penting: $user["key"] = $value bersifat upsert — jika key sudah ada, nilainya di-update; jika belum ada, key-nya dibuat. Tidak perlu cek dulu apakah key ada sebelum assign.

Nested Associative Array

Value dari associative array bisa berupa array lagi. Ini adalah cara paling umum merepresentasikan data terstruktur — misalnya daftar karyawan yang masing-masing punya skill.

php
<?php

$employees = [
    [
        "id" => 1,
        "name" => "Andi",
        "position" => "Developer",
        "skills" => ["PHP", "JavaScript", "SQL"]
    ],
    [
        "id" => 2,
        "name" => "Budi",
        "position" => "Designer",
        "skills" => ["Figma", "CSS", "Illustrator"]
    ]
];

// Access nested
echo $employees[0]["name"];        // Output: Andi
echo $employees[0]["skills"][0];   // Output: PHP

// Loop nested
foreach ($employees as $emp) {
    echo "{$emp['name']} - {$emp['position']}\n";
    echo "Skills: " . implode(", ", $emp["skills"]) . "\n";
}
// Output:
// Andi - Developer
// Skills: PHP, JavaScript, SQL
// Budi - Designer
// Skills: Figma, CSS, Illustrator

?>

Struktur seperti ini persis dengan bentuk data JSON dari API — itulah kenapa PHP dan JSON "berteman baik": json_encode() untuk mengirim, json_decode() untuk menerima.

php
<?php

// Dari PHP ke JSON
$data = ["name" => "Andi", "age" => 25];
echo json_encode($data);
// Output: {"name":"Andi","age":25}

// Dari JSON ke PHP (asosiatif array)
$json = '{"name":"Budi","age":30}';
$decoded = json_decode($json, true);  // true = jadikan array, bukan object
echo $decoded["name"];  // Output: Budi

?>

Common Operations

Associative array punya banyak function pendukung. Yang paling sering dipakai: array_merge(), array_keys(), array_values(), dan operator +.

Menggabungkan Array

Ada dua cara menggabungkan associative array, dan hasilnya berbeda saat ada key yang sama:

php
<?php

$defaults = [
    "debug" => false,
    "log_level" => "error",
    "timeout" => 30
];

$userConfig = [
    "debug" => true,        // key sama dengan defaults
    "db_host" => "localhost"
];

// array_merge(): key yang muncul belakangan MENANG
$config = array_merge($defaults, $userConfig);
print_r($config);
// Output:
// Array
// (
//     [debug] => true        <-- dari $userConfig, menimpa
//     [log_level] => error   <-- dari $defaults
//     [timeout] => 30        <-- dari $defaults
//     [db_host] => localhost <-- dari $userConfig
// )

// Operator + : key yang muncul pertama MENANG
$config2 = $defaults + $userConfig;
print_r($config2);
// Output:
// Array
// (
//     [debug] => false       <-- dari $defaults, userConfig diabaikan
//     [log_level] => error
//     [timeout] => 30
//     [db_host] => localhost <-- key baru tetap masuk
// )

?>
⚠️Perhatian

array_merge($a, $b) dan $a + $b menghasilkan urutan prioritas yang berlawanan. Untuk array string-key: array_merge — yang belakangan menang; operator + — yang pertama menang. Pilih sesuai kebutuhan, dan jangan sampai tertukar.

Pola array_merge($defaults, $userConfig) sangat umum dipakai untuk menggabungkan konfigurasi default dengan konfigurasi user.

Mengambil Key dan Value

php
<?php

$config = [
    "db_host" => "localhost",
    "db_name" => "myapp",
    "db_user" => "root",
    "db_pass" => "",
    "debug" => true
];

// Get all keys
$keys = array_keys($config);
print_r($keys);
// Output: Array ( [0] => db_host [1] => db_name [2] => db_user [3] => db_pass [4] => debug )

// Get all values
$values = array_values($config);
print_r($values);
// Output: Array ( [0] => localhost [1] => myapp [2] => root [3] => [4] => 1 )

// Check if key exists
if (array_key_exists("db_host", $config)) {
    echo "DB Host: {$config['db_host']}";  // Output: DB Host: localhost
}

// Safe access dengan null coalescing
$timeout = $config["timeout"] ?? 30;
echo $timeout;  // Output: 30 (key timeout tidak ada, pakai default)

?>
💡Tip

array_keys() dan array_values() adalah jembatan antara associative array dan indexed array. Setelah diambil, hasilnya bisa di-loop dengan for biasa, di-sort, atau dikirim ke function yang butuh indexed array.

Use Case Nyata

1. Konfigurasi Aplikasi

php
<?php

$config = [
    "db_host" => "localhost",
    "db_name" => "myapp",
    "db_user" => "root",
    "db_pass" => "",
    "debug" => true
];

// Merge defaults + config
$defaults = ["debug" => false, "log_level" => "error"];
$config = array_merge($defaults, $config);

echo $config["log_level"];  // Output: error (dari defaults)

// Loop untuk menampilkan semua config
foreach ($config as $key => $value) {
    echo "$key = $value\n";
}
// Output:
// debug = 1
// log_level = error
// db_host = localhost
// db_name = myapp
// db_user = root
// db_pass =

?>

2. Data dari Form (mirip $_POST)

php
<?php

// PHP otomatis menyimpan data form ke $_POST
// Bentuknya persis associative array seperti ini:
$_POST = [
    "username" => "andi123",
    "email" => "andi@example.com",
    "password" => "rahasia"
];

// Validasi sederhana
$errors = [];

if (empty($_POST["username"])) {
    $errors["username"] = "Username wajib diisi";
}
if (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
    $errors["email"] = "Format email salah";
}

print_r($errors);
// Output:
// Array
// (
//     [email] => Format email salah
// )

?>

3. HTTP Headers

php
<?php

$headers = [
    "Content-Type" => "application/json",
    "Authorization" => "Bearer token123",
    "Accept" => "application/json"
];

// Cek header tertentu dengan cara case-insensitive
foreach ($headers as $name => $value) {
    echo "$name: $value\n";
}
// Output:
// Content-Type: application/json
// Authorization: Bearer token123
// Accept: application/json

?>

Common Mistakes

MistakeContoh SalahKenapa SalahSolusi
Tertukar urutan =>"Andi" => "name"Key harus di kiri, value di kananTulis "name" => "Andi"
Mengira key otomatis diurutkanforeach mengharap urutan alfabetPHP mempertahankan urutan insertUrutkan eksplisit dengan ksort()
Akses key tanpa cekecho $user["city"]; tanpa tahu ada/tidakWarning "Undefined array key"$user["city"] ?? "Tidak ada"
array_merge vs + tertukarmengharap key user menang dengan ++ mempertahankan key yang pertamaGunakan array_merge jika key belakangan harus menang
Menaruh logika rumit di dalam foreachloop 1000x memanggil count() di dalamBoros dan lambatHitung di luar loop

Exercise

  1. Buat database configuration sebagai associative array
  2. Loop dan print semua key-value pairs dengan format key = value
  3. Buat nested array untuk cart shopping (items, quantities, prices)
  4. Buat array $defaults dan $userSettings dengan satu key yang sama, lalu bandingkan hasil array_merge() vs operator +
  5. Gunakan array_merge() untuk membuat config final: defaults yang bisa di-override oleh user settings
  6. Ubah associative array menjadi JSON dengan json_encode(), lalu decode kembali dengan json_decode($json, true) dan akses salah satu key-nya

Summary

KonsepPenjelasan
Associative arrayArray dengan key string, ditulis "key" => "value"
CRUDCreate ($a["k"] = v), Read ($a["k"]), Update (assign ulang), Delete (unset($a["k"]))
Nested arrayValue berupa array lagi; cocok untuk data JSON
array_merge($a, $b)Gabungkan; key di $b menimpa key yang sama di $a
$a + $bGabungkan; key di $a menang, key baru dari $b tetap masuk
array_keys($arr)Ambil semua key sebagai indexed array
array_values($arr)Ambil semua value sebagai indexed array
array_key_exists($k, $arr)Cek keberadaan key (termasuk yang nilainya null)
$arr[$k] ?? $defaultAkses aman dengan nilai fallback
json_encode() / json_decode()Konversi antara PHP array dan JSON

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 5

Uji pemahamanmu tentang Array