array_key_exists('key', $array) mengembalikan true kalau array punya key itu dan false kalau tidak. Perhatikan urutannya: key lebih dulu, array kedua. Fungsi ini mengembalikan true bahkan saat nilai yang tersimpan di key itu null, dan hanya itulah yang tidak dilakukan isset().
Untuk memeriksa nilai, bukan key, pakai in_array().
array_key_exists vs isset
Keduanya memeriksa key. Hasilnya hanya berbeda saat nilainya null: isset() menganggap nilai null sebagai "tidak di-set", sedangkan array_key_exists() melaporkan apa yang sebenarnya ada di array.
0 dan '' dianggap di-set oleh keduanya; hanya null yang membuat hasilnya berbeda. Mana yang kamu pakai tergantung arti null di datamu:
- Pakai
isset()saatnullberarti "tidak ada nilai". Ini kasus yang paling umum, ia adalah konstruksi bahasa (sedikit lebih cepat), dan ia menerima jalur bersarang serta variabel yang belum didefinisikan tanpa warning. - Pakai
array_key_exists()saatnulladalah nilai sungguhan yang harus kamu bedakan dari key yang tidak ada: field JSON yang dikirim sebagainull, kolom database yang bernilaiNULL, atau opsi yang sengaja diisinulluntuk mengosongkannya.
Halaman isset membahas kegunaan lainnya, termasuk memeriksa beberapa variabel sekaligus.
Membedakan null dan key yang tidak ada di payload JSON
Contoh umum ketika hanya array_key_exists() yang memberi jawaban benar: API yang memperbarui sebuah record dari JSON. Field yang dikirim sebagai null berarti "kosongkan", sedangkan field yang tidak dikirim berarti "jangan diubah". isset() melihat keduanya sama saja.
Dengan isset($patch[$field]), nomor telepon akan tetap ada, karena null akan terlihat seperti field yang tidak dikirim.
key_exists() adalah fungsi yang sama
key_exists() adalah alias dari array_key_exists(), warisan dari PHP versi awal. Argumennya sama, hasilnya sama. Pilih nama lengkapnya, karena itulah yang diharapkan pembaca kodemu.
Tipe key: "1" dan 1 adalah key yang sama
Key array berupa integer atau string, dan string yang berisi bilangan bulat desimal biasa disimpan sebagai integer. Jadi array_key_exists('1', $arr) menemukan key 1, begitu pula sebaliknya. String seperti '01' tetap string dan merupakan key yang berbeda.
Memeriksa key bersarang dan beberapa key
array_key_exists() hanya melihat satu level. Untuk jalur bersarang yang tidak peduli null, isset($a['x']['y']) memeriksa setiap level sekaligus. Untuk jalur yang memedulikannya, sebuah fungsi bantu pendek bisa menelusuri level-levelnya. Untuk memeriksa bahwa beberapa key ada semua, bandingkan dengan array_diff_key().
array_flip($required) mengubah daftar nama menjadi key supaya array_diff_key() bisa membandingkannya dengan key milik input; yang tersisa adalah daftar field yang tidak ada, siap dipakai untuk pesan error.
Objek butuh property_exists
PHP versi lama menerima objek di array_key_exists(). PHP 8 justru melempar TypeError. Untuk objek, property_exists() memeriksa property yang dideklarasikan atau dinamis (bahkan yang diisi null), dan isset($obj->prop) bekerja seperti isset() pada array.
Dua baris terakhir menunjukkan cara lain: get_object_vars() mengubah property objek yang bisa diakses menjadi array, lalu fungsi-fungsi array bisa dipakai.
Pertanyaan yang sering diajukan
Kenapa isset mengembalikan false padahal array_key_exists mengembalikan true?
Karena key itu berisi null. isset($arr['k']) bernilai true hanya kalau key-nya ada dan nilainya bukan null, sedangkan array_key_exists('k', $arr) bernilai true setiap kali key itu ada di array. Untuk nilai lain, termasuk 0, '', dan false, keduanya memberi jawaban yang sama.
Apa itu key_exists di PHP?
Alias dari array_key_exists(). key_exists('id', $row) dan array_key_exists('id', $row) berperilaku sama. Kebanyakan kode memakai nama yang lebih panjang.
Bagaimana cara mengecek key bersarang di PHP?
Periksa setiap level: isset($data['user']['address']['city']) memeriksa seluruh jalurnya sekaligus dan tidak pernah memunculkan warning kalau ada level yang hilang. Kalau nilai null harus dianggap ada, telusuri jalurnya dengan array_key_exists() level demi level.
Apakah array_key_exists bisa dipakai pada objek?
Tidak. Sejak PHP 8.0, memberikan objek akan melempar TypeError. Pakai property_exists($obj, 'name') untuk property yang dideklarasikan, atau isset($obj->name).