Membaca dan Menulis Array

Mengakses elemen dengan [], isset versus array_key_exists, dan unset.

Daftar isi

Topik ini membahas pembacaan dan penulisan elemen array, mulai dari akses dengan kurung siku, pemeriksaan keberadaan kunci dengan isset() dan array_key_exists(), penghapusan elemen dengan unset(), hingga pola akses aman untuk kunci yang belum ada. Setelah membacanya, elemen array dapat dibaca, diubah, ditambah, dan dihapus dengan sengaja tanpa memicu peringatan kunci yang tidak tersedia.

Membaca dan mengubah dengan kurung siku#

Pembacaan elemen dilakukan dengan menuliskan kunci di dalam kurung siku setelah variabel, misalnya $stok['kertas']. Bentuk yang sama dipakai untuk mengubah nilai pada kunci yang sudah ada maupun menambah elemen baru, karena penulisan pada kunci yang belum terdapat di array otomatis menambahkannya. Kurung siku kosong $stok[] menambah elemen dengan kunci otomatis di ujung array. Pada array bertingkat, yaitu array yang elemennya juga berupa array, kunci dituliskan berantai seperti $data['siswa']['nilai'].

PHP juga mendukung destructuring, yaitu membongkar isi array langsung ke beberapa variabel dengan penulisan [$nama, $nilai] = $baris untuk elemen berurutan, atau ['nama' => $n, 'nilai' => $nl] = $peserta untuk elemen yang dipilih berdasarkan kuncinya. Contoh berikut membaca satu elemen, mengubahnya, menambah elemen baru, lalu membongkar array dua elemen ke dua variabel.

php baca-tulis.php
<?php

$stok = ['kertas' => 120, 'spidol' => 45];

echo $stok['kertas'], "\n";

$stok['kertas'] = 100;
$stok['penghapus'] = 60;

print_r($stok);

$baris = ['Budi', 85];
[$nama, $nilai] = $baris;

echo "$nama memperoleh nilai $nilai\n";
text Keluaran
120
Array
(
    [kertas] => 100
    [spidol] => 45
    [penghapus] => 60
)
Budi memperoleh nilai 85

Keluaran print_r() menunjukkan bahwa penulisan pada kunci baru menambah elemen tanpa menggeser elemen lain. Baris terakhir memperlihatkan hasil destructuring yang mengisi $nama dan $nilai menurut urutan kunci 0 dan 1.

Memeriksa kunci dengan isset dan array_key_exists#

Fungsi isset() mengembalikan true apabila kunci ada dan nilainya bukan null. Fungsi array_key_exists() mengembalikan true apabila kunci ada tanpa memandang nilainya. Perbedaan ini terlihat pada elemen yang sengaja diberi nilai null, misalnya catatan barang rusak yang jumlahnya memang belum diisi. Kedua fungsi juga bersifat aman untuk kunci yang belum ada, sehingga keduanya dapat dipanggil tanpa memicu peringatan.

Contoh berikut menguji kunci dengan nilai terisi, kunci bernilai null, dan kunci yang sama sekali tidak ada.

php periksa-kunci.php
<?php

$stok = ['kertas' => 120, 'rusak' => null];

var_dump(isset($stok['kertas']));
var_dump(isset($stok['rusak']));
var_dump(array_key_exists('rusak', $stok));
var_dump(array_key_exists('spidol', $stok));
text Keluaran
bool(true)
bool(false)
bool(true)
bool(false)

Hasil pada keluaran memperlihatkan perbedaannya secara langsung. Kunci 'rusak' bernilai null sehingga isset() melaporkan false, sedangkan array_key_exists() melaporkan true karena kuncinya memang tercatat. Kunci 'spidol' yang belum ada dilaporkan false oleh keduanya.

Menghapus elemen dengan unset#

Pemanggilan unset($stok['spidol']) menghapus pasangan kunci dan nilai tersebut dari array. Elemen lain beserta kuncinya tidak digeser, sehingga array asosiatif tetap memegang kuncinya, sedangkan array terindeks ditinggalkan dengan lubang kunci. Fungsi count() menghitung sisa elemen setelah penghapusan. Apabila array perlu kembali berbentuk list, yaitu array dengan kunci bilangan berurutan tanpa lubang, array_values() menyusun ulang kuncinya mulai dari 0.

Contoh berikut menghapus satu elemen array asosiatif, lalu menghapus satu elemen array terindeks dan menyusun ulang kuncinya.

php hapus-elemen.php
<?php

$stok = ['kertas' => 120, 'spidol' => 45, 'penghapus' => 60];

unset($stok['spidol']);

print_r($stok);
echo count($stok), "\n";

$nilai = [70, 80, 90, 100];
unset($nilai[1]);

print_r($nilai);
print_r(array_values($nilai));
text Keluaran
Array
(
    [kertas] => 120
    [penghapus] => 60
)
2
Array
(
    [0] => 70
    [2] => 90
    [3] => 100
)
Array
(
    [0] => 70
    [1] => 90
    [2] => 100
)

Array asosiatif kehilangan kunci 'spidol' tetapi kunci 'kertas' dan 'penghapus' tetap pada tempatnya, dan count() melaporkan dua elemen tersisa. Pada array terindeks, kunci 1 hilang dan kunci 0, 2, 3 tetap tertulis sampai array_values() menyusunnya ulang menjadi 0, 1, 2.

Pola akses aman untuk kunci yang belum ada#

Membaca kunci yang belum ada pada PHP 8 menghasilkan nilai null disertai pesan E_WARNING bertuliskan Undefined array key. Nilai null yang masuk tanpa disadari sering menjadi sumber perhitungan keliru di lokasi yang jauh dari titik pembacaannya, sehingga akses langsung pada kunci yang belum pasti perlu dihindari. Pola yang aman adalah memeriksa kunci terlebih dahulu dengan isset() atau array_key_exists(). Sebagai alternatif, kunci dibaca dengan operator ?? yang mengambil nilai default apabila kunci tidak ada atau bernilai null.

Contoh berikut membaca kunci yang belum ada dengan operator ??, lalu membaca kunci yang sudah ada setelah diperiksa dengan array_key_exists().

php akses-aman.php
<?php

$stok = ['kertas' => 120];

$spidol = $stok['spidol'] ?? 0;

echo "spidol: $spidol\n";

if (array_key_exists('kertas', $stok)) {
    echo "kertas: {$stok['kertas']}\n";
}
text Keluaran
spidol: 0
kertas: 120

Operator ?? membaca kunci 'spidol' yang belum ada dan mengambil 0 sebagai nilai default tanpa memicu peringatan apa pun. Cabang if dieksekusi karena kunci 'kertas' memang tercatat, sehingga pembacaan di dalam kurung kurawal aman.

Kesalahan umum#

  • Membaca kunci tanpa pemeriksaan. Akses langsung pada kunci yang belum ada memicu E_WARNING dan menghasilkan null, sehingga perhitungan berikutnya memakai nilai yang tidak pernah diisi. Baca dengan operator ?? atau periksa kuncinya terlebih dahulu.
  • Menganggap hasil false dari isset() berarti kunci tidak ada. Nilai null pada kunci yang tercatat tetap membuat isset() mengembalikan false, sehingga pemeriksaan keberadaan kunci perlu memakai array_key_exists().
  • Mengharapkan indeks menyusul otomatis setelah unset(). Kunci elemen lain tidak digeser, sehingga array terindeks ditinggalkan dengan lubang. Panggil array_values() apabila bentuk berurutan diperlukan kembali.
  • Menghapus seluruh array ketika maksudnya menghapus satu elemen. unset($stok) menghapus variabelnya, sedangkan unset($stok['spidol']) hanya menghapus satu elemen. Pastikan kunci dituliskan pada pemanggilan unset().

Ringkasan#

  • Elemen dibaca, diubah, dan ditambah dengan kurung siku, termasuk penambahan lewat kurung siku kosong di ujung array.
  • isset() menguji kunci dengan nilai bukan null, sedangkan array_key_exists() menguji keberadaan kunci apa adanya.
  • unset() menghapus satu pasangan kunci dan nilai tanpa menggeser kunci lainnya, dan array_values() menyusun ulang kunci bilangan.
  • Operator ?? memberi nilai default ketika kunci tidak ada atau bernilai null, sehingga pembacaan tidak memicu E_WARNING.

Referensi#