Indeks bernomor memang praktis, tetapi angka jarang menceritakan makna. Membaca $produk[0] tidak memberi petunjuk apa isinya — nama? harga? stok? Setiap kali kembali membaca kode, kita harus mengingat posisi setiap nilai dengan hafalan. Associative array memecahkan masalah ini dengan membiarkan kita menamai setiap kunci sendiri: "nama", "harga", "stok". Struktur ini menjadi tulang punggung hampir semua data terstruktur di PHP — konfigurasi aplikasi, baris hasil database, hingga hasil json_decode() semuanya berbentuk associative array. Pada Chapter ini kita akan mempelajari sintaksnya, cara memeriksa keberadaan kunci dengan benar, dan aturan konversi kunci yang sering mengejutkan pemula.
Array dengan Kunci Bernama #
Associative array ditulis dengan pola kunci => nilai di antara tanda kurung siku. Satu pasangan kunci-nilai dipisahkan koma, dan kunci string selalu ditulis dengan tanda kutip — sama seperti string pada umumnya:
<?php
$produk = [
"nama" => "Kopi Gayo",
"harga" => 85000,
"stok" => 12,
];
echo "Nama produk: " . $produk["nama"] . "\n";
echo "Harga: Rp" . $produk["harga"] . "\n";
echo "Stok tersedia: " . $produk["stok"] . " pcs\n";Output yang Dihasilkan:
Nama produk: Kopi Gayo
Harga: Rp85000
Stok tersedia: 12 pcsMari kita telaah baris-baris kode di atas:
- Baris 2-6 (
$produk = [...]): membuat associative array dengan tiga pasangan kunci-nilai — kunci"nama"menyimpan string,"harga"dan"stok"menyimpan integer. - Baris 8 (
echo $produk["nama"]): membaca nilai yang tersimpan di bawah kunci"nama", yaitu"Kopi Gayo"— tidak ada lagi hafalan posisi. - Baris 9-10: membaca kunci
"harga"dan"stok"dengan cara yang sama persis.
Kunci string wajib dikutip. Menulis $produk[nama] tanpa kutip membuat PHP mencari constant bernama nama; karena constant tersebut tidak ada, PHP 8 menghentikan program dengan Error. Aturan ini sama dengan aturan penulisan string yang sudah kita kenal sejak Section String dan Text Processing.
Mencampur Kunci String dan Integer #
Kunci string dan integer boleh berdampingan dalam satu array — PHP tidak melarang campuran sama sekali. Urutan penyisipan tetap dipertahankan: elemen tampil sesuai urutan penulisan, bukan diurutkan berdasarkan jenis kuncinya:
<?php
$mahasiswa = [
"nama" => "Siti Rahma",
"umur" => 20,
7 => "NIM 2211007",
"kota" => "Bandung",
];
print_r($mahasiswa);Output yang Dihasilkan:
Array
(
[nama] => Siti Rahma
[umur] => 20
[7] => NIM 2211007
[kota] => Bandung
)Output print_r() menampilkan keempat elemen persis sesuai urutan penulisan: dua kunci string, lalu kunci integer 7, lalu kunci string lagi. Pola campuran seperti ini berguna ketika sebagian data memang bernomor — nomor induk mahasiswa, kode produk — sementara bagian lain lebih jelas dengan label. Satu hal yang perlu diingat: kunci dalam satu array harus unik; menulis dua elemen dengan kunci yang sama membuat elemen terakhir menimpa yang pertama.
Memeriksa Kunci: isset vs array_key_exists #
Pada Chapter sebelumnya kita melihat bahwa membaca indeks yang tidak ada memicu Warning: Undefined array key. Sebelum membaca kunci yang belum pasti ada, program perlu memeriksanya lebih dulu — dan PHP menyediakan dua alat yang mirip tetapi tidak identik: isset() dan array_key_exists(). Perbedaannya terletak pada penanganan nilai null:
<?php
$pengguna = [
"nama" => "Budi",
"email" => null,
];
var_dump(isset($pengguna["nama"]));
var_dump(isset($pengguna["email"]));
var_dump(array_key_exists("email", $pengguna));
var_dump(array_key_exists("telepon", $pengguna));Output yang Dihasilkan:
bool(true)
bool(false)
bool(true)
bool(false)Empat baris hasil di atas menceritakan dua perilaku yang berbeda. isset() mengembalikan true hanya jika kunci ada dan nilainya bukan null — itulah mengapa isset($pengguna["email"]) menghasilkan bool(false) meskipun kunci "email" jelas ada. Sebaliknya, array_key_exists() hanya menjawab satu pertanyaan: apakah kuncinya ada? Nilainya null atau bukan bukan urusannya, sehingga hasilnya bool(true). Untuk kunci yang benar-benar tidak ada seperti "telepon", keduanya sepakat mengembalikan false.
| Kondisi kunci | isset() | array_key_exists() |
|---|---|---|
Ada, nilainya "Budi" | true | true |
Ada, nilainya null | false | true |
| Tidak ada sama sekali | false | false |
Aturan Konversi Kunci #
PHP hanya mengenal dua jenis kunci: integer dan string. Tipe lain yang kita tulis sebagai kunci akan dikonversi lebih dulu — perilaku yang dikenal sebagai key juggling, kerabat dekat dari type juggling yang sudah kita bahas pada Chapter Type Juggling . Konversi paling mengejutkan menimpa string yang terlihat seperti bilangan bulat:
<?php
$data = [
"5" => "lima sebagai string",
5 => "lima sebagai integer",
];
echo $data[5] . "\n";
echo "Jumlah elemen: " . count($data) . "\n";Output yang Dihasilkan:
lima sebagai integer
Jumlah elemen: 1String "5" dikonversi menjadi integer 5 saat disimpan, sehingga dua baris di atas sebenarnya menulis kunci yang sama. Elemen kedua menimpa elemen pertama — terbukti dari nilai yang tersisa adalah "lima sebagai integer" dan count() yang hanya mengembalikan 1. Sebaliknya, string dengan nol di depan tidak dianggap bilangan bulat kanonis sehingga tetap menjadi string:
<?php
$kodePos = [
"08" => "kode dengan string 08",
8 => "kode dengan integer 8",
];
echo "Jumlah elemen: " . count($kodePos) . "\n";
echo $kodePos["08"] . "\n";
echo $kodePos[8] . "\n";Output yang Dihasilkan:
Jumlah elemen: 2
kode dengan string 08
kode dengan integer 8Kunci "08" dan 8 kini menjadi dua entri yang berbeda — count() mengembalikan 2 dan keduanya bisa dibaca terpisah. Perilaku ini penting untuk data seperti kode pos atau kode area yang memang diawali nol. Berikut rangkuman lengkap aturan konversinya:
| Kunci yang ditulis | Disimpan sebagai | Catatan |
|---|---|---|
"8" | 8 (integer) | String bilangan bulat kanonis dikonversi |
"08" | "08" (string) | Nol di depan membuatnya tidak kanonis |
8.7 | 8 (integer) | Pecahan dibuang; PHP 8.1+ memicu Deprecated karena hilangnya presisi |
true | 1 (integer) | Boolean dikonversi ke integer |
false | 0 (integer) | Sama seperti true |
null | "" (string kosong) | null menjadi string kosong |
| Array atau object | ditolak | TypeError — bukan tipe kunci yang sah |
Ringkasan #
Associative array memetakan kunci bernama ke nilai, membuat data terstruktur mudah dibaca dan diakses. Kunci string dan integer boleh dicampur, kunci harus unik, dan pemeriksaan keberadaannya punya dua alat dengan semantik berbeda: isset() menganggap null sebagai tidak ada, array_key_exists() tidak. Aturan key juggling menjelaskan kapan string berubah menjadi integer — pengetahuan yang menyelamatkan kita dari data kode pos yang tiba-tiba bertabrakan. Data nyata sering berlapis: satu produk punya nama, harga, dan dimensi ukuran sendiri. Kita akan menyusun struktur berlapis tersebut pada Chapter Multidimensional Arrays.
Referensi #
- Tipe Array: Aturan Kunci — Dokumentasi Resmi PHP
- array_key_exists — Dokumentasi Resmi PHP
- isset — Dokumentasi Resmi PHP
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// Contoh 1: associative array dengan kunci bernama
$produk = [
"nama" => "Kopi Gayo",
"harga" => 85000,
"stok" => 12,
];
echo "Nama produk: " . $produk["nama"] . "\n";
echo "Harga: Rp" . $produk["harga"] . "\n";
echo "Stok tersedia: " . $produk["stok"] . " pcs\n";
// Contoh 2: mencampur kunci string dan integer
$mahasiswa = [
"nama" => "Siti Rahma",
"umur" => 20,
7 => "NIM 2211007",
"kota" => "Bandung",
];
print_r($mahasiswa);
// Contoh 3: isset vs array_key_exists
$pengguna = [
"nama" => "Budi",
"email" => null,
];
var_dump(isset($pengguna["nama"]));
var_dump(isset($pengguna["email"]));
var_dump(array_key_exists("email", $pengguna));
var_dump(array_key_exists("telepon", $pengguna));
// Contoh 4: konversi kunci "5" menjadi integer 5
$data = [
"5" => "lima sebagai string",
5 => "lima sebagai integer",
];
echo $data[5] . "\n";
echo "Jumlah elemen: " . count($data) . "\n";
// Contoh 5: kunci "08" tetap menjadi string
$kodePos = [
"08" => "kode dengan string 08",
8 => "kode dengan integer 8",
];
echo "Jumlah elemen: " . count($kodePos) . "\n";
echo $kodePos["08"] . "\n";
echo $kodePos[8] . "\n";