Array pada PHP bekerja sebagai peta terurut (ordered map), yaitu struktur data yang memasangkan setiap nilai dengan sebuah kunci (key) sekaligus mengingat urutan penyisipannya. Satu tipe data ini melayani dua peran sekaligus, yakni array terindeks bernomor dan array asosiatif berlabel. Topik ini membahas cara kerja peta terurut tersebut, dua bentuk array di dalamnya, kunci otomatis yang dihasilkan PHP, serta konversi kunci yang dilakukan secara otomatis. Setelah membacanya, bentuk kunci dan urutan sebuah array dapat dirancang dengan sengaja, bukan sekadar diharapkan.
Peta terurut dalam satu tipe data#
Banyak bahasa pemrograman memisahkan deret berindeks dan peta kunci-nilai menjadi dua tipe berbeda, misalnya list dan dict pada Python. PHP menggabungkan keduanya ke dalam satu tipe array. Setiap elemen disimpan sebagai pasangan kunci dan nilai, dan setiap pasangan menempati posisi sesuai waktu penambahannya. Urutan ini dipertahankan meskipun kuncinya berupa bilangan yang tidak berurutan atau string apa pun, sehingga pencetakan dan perulangan selalu mengunjungi elemen dari yang pertama dimasukkan hingga yang terakhir.
Di balik layar, PHP menyimpan array sebagai hash table yang juga memelihara rantai elemen menurut urutan penyisipan. Rincian implementasinya tidak perlu dikuasai untuk menggunakan array, tetapi dua akibatnya perlu diketahui. Membaca elemen berdasarkan kunci berlangsung cepat tanpa bergantung pada banyaknya elemen, dan urutan tampilan mengikuti urutan penyisipan, bukan urutan kunci yang tersusun rapi.
Diagram berikut memperlihatkan array $stok sebagai barisan pasangan kunci dan nilai. Barisan tersebut adalah urutan penyisipan yang dipertahankan PHP dari elemen pertama hingga elemen terakhir.
Array terindeks dan array asosiatif#
Array terindeks memakai kunci berupa bilangan bulat yang dimulai dari nol dan bertambah satu untuk setiap elemen berikutnya. Bentuk ini cocok untuk deret yang urutannya penting, misalnya daftar nilai ujian seorang siswa. Array asosiatif memakai kunci berupa string yang diberi label bermakna, misalnya nama barang pada data stok gudang. Kedua bentuk itu bukan dua tipe berbeda, melainkan penggunaan peta terurut yang sama dengan gaya kunci yang berbeda.
Contoh berikut membuat satu array terindeks dan satu array asosiatif, lalu mencetaknya dengan print_r(). Fungsi ini menampilkan setiap pasangan dalam bentuk [kunci] => nilai, sehingga kunci yang dipilih PHP terlihat apa adanya.
<?php
$nilai = [78, 85, 91];
$stok = ['kertas' => 120, 'spidol' => 45, 'penghapus' => 60];
print_r($nilai);
print_r($stok);Array
(
[0] => 78
[1] => 85
[2] => 91
)
Array
(
[kertas] => 120
[spidol] => 45
[penghapus] => 60
)Keluarannya menegaskan bahwa keduanya merupakan struktur yang serupa. Array $nilai mendapat kunci 0 sampai 2 secara otomatis, sedangkan array $stok memakai kunci string yang dituliskan secara eksplisit. Seluruh fungsi array PHP bekerja pada kedua bentuk tersebut dengan cara yang sama, dan perbedaannya hanya pada kebiasaan penulisan kunci.
Kunci otomatis dan kunci eksplisit#
Elemen baru yang ditambahkan tanpa kunci mendapat kunci berupa bilangan bulat terbesar yang sudah ada ditambah satu. Apabila seluruh kunci bilangan bernilai negatif, kunci baru yang dipilih adalah 0. Aturan ini berlaku pada penulisan literal maupun penambahan dengan kurung siku kosong []. Karena itu, menyisipkan kunci 5 di tengah penulisan membuat elemen berikutnya mendapat kunci 6, bukan 1. Aturan yang sama berlaku ketika kunci terbesar tidak berada pada posisi terakhir, karena PHP selalu memeriksa seluruh kunci bilangan yang ada untuk mencari yang terbesar.
Skrip berikut menuliskan daftar belanja dengan menambahkan elemen tanpa kunci, menyisipkan satu elemen dengan kunci 5, lalu menambahkan satu elemen lagi tanpa kunci. Skrip dijalankan dari terminal agar cara menjalankan berkas PHP ikut terlihat.
<?php
$belanja = [];
$belanja[] = 'beras';
$belanja[] = 'telur';
$belanja[5] = 'gula';
$belanja[] = 'minyak';
print_r($belanja);# menjalankan skrip dari direktori tempat berkas disimpan
php kunci-otomatis.phpArray
(
[0] => beras
[1] => telur
[5] => gula
[6] => minyak
)Keluarannya memperlihatkan kunci 0 dan 1 untuk dua elemen pertama, kunci 5 yang dituliskan secara eksplisit, lalu kunci 6 untuk elemen terakhir. Kunci 6 muncul karena PHP melanjutkan dari kunci bilangan terbesar, bukan dari kunci terakhir yang dituliskan.
Konversi kunci dan kunci ganda#
Kunci yang sah berupa bilangan bulat atau string. PHP mengonversi beberapa bentuk kunci secara otomatis sebelum menyimpannya. String yang memuat bilangan bulat desimal yang sah menjadi bilangan bulat, sehingga "8" tersimpan sebagai kunci 8. Nol di depan membuat string tetap string, sehingga "08" tidak sama dengan 8. Nilai true menjadi 1, nilai false menjadi 0, dan null menjadi string kosong. Kunci pecahan dipotong ke arah nol, dan sejak PHP 8.1 penulisan kunci pecahan yang kehilangan bagian desimalnya memicu pesan deprecated.
Penulisan kunci yang sama tidak menambah elemen baru. Nilai pada kunci tersebut digantikan oleh nilai yang dituliskan belakangan, sedangkan posisinya tetap pada penyisipan pertama. Contoh berikut mencantumkan beberapa bentuk kunci sekaligus, lalu menuliskan kunci ganda untuk memperlihatkan penggantiannya.
<?php
$kunci = [
"8" => 'string numerik',
"08" => 'tetap string',
true => 'bool jadi int',
null => 'null jadi string kosong',
];
var_dump(array_keys($kunci));
$ganda = ['x' => 1, 'x' => 2, 10 => 'a', 10 => 'b'];
print_r($ganda);array(4) {
[0]=>
int(8)
[1]=>
string(2) "08"
[2]=>
int(1)
[3]=>
string(0) ""
}
Array
(
[x] => 2
[10] => b
)Keluaran var_dump() menunjukkan bahwa array_keys() mengembalikan 8 sebagai int, "08" sebagai string, 1 untuk kunci true, dan string kosong untuk kunci null. Array $ganda hanya memuat dua elemen karena setiap kunci yang dituliskan dua kali hanya menyimpan nilai terakhir, yaitu 2 dan 'b'.
Kesalahan umum#
- Mengharapkan urutan alfabetis atau numerik pada array asosiatif. Array asosiatif disimpan menurut urutan penyisipan, sehingga pencetakan mengikuti urutan itu, bukan urutan kunci yang tersusun. Pengurutan berdasarkan kunci adalah tugas
ksort(). - Menuliskan kunci pecahan seperti 1.7. Kunci tersebut dipotong menjadi 1 dan memicu pesan deprecated sejak PHP 8.1 karena ada bagian desimal yang hilang. Gunakan kunci bilangan bulat atau string agar maksudnya tidak kabur.
- Menganggap
"08"dan 8 kunci yang sama. Nol di depan membuat kunci tetap berupa string, sehingga kunci"08"dan kunci 8 menempati dua elemen yang berbeda pada array yang sama. - Mengira kunci ganda menambah elemen. Kunci yang dituliskan ulang hanya mengganti nilai elemen lama, sehingga jumlah elemen tidak bertambah dan nilai sebelumnya hilang tanpa jejak.
Ringkasan#
- Array PHP adalah peta terurut yang memasangkan setiap nilai dengan kunci dan menyimpan pasangan itu menurut urutan penyisipannya.
- Array terindeks dan array asosiatif adalah satu tipe yang sama dengan gaya kunci yang berbeda.
- Elemen tanpa kunci mendapat kunci bilangan terbesar ditambah satu, atau 0 apabila seluruh kunci bilangan bernilai negatif.
- String numerik, boolean,
null, dan pecahan dikonversi otomatis menjadi kunci, sedangkan kunci ganda mengganti nilai lama tanpa menambah elemen.
Referensi#
- Arrays — Manual PHP — Menetapkan definisi array sebagai peta terurut, sintaks penulisannya, dan aturan konversi kunci.
- print_r — Manual PHP — Menjelaskan format pencetakan array yang dipakai pada keluaran contoh topik ini.