Perbedaan isset dan array_key_exists di PHP muncul saat kunci array berisi nilai null. isset() mengembalikan false untuk kunci yang ada tetapi bernilai null, sedangkan array_key_exists() tetap mengembalikan true. Pilihan fungsi bergantung pada apakah kamu perlu membedakan kunci yang tidak ada dengan kunci yang nilainya kosong.
Perilaku dasar kedua fungsi
Keduanya menerima nama kunci sebagai argumen pertama dan array sebagai argumen kedua. Perbedaannya ada pada definisi “ada”. isset() memeriksa apakah variabel atau elemen array sudah dideklarasikan sekaligus tidak bernilai null. array_key_exists() hanya memeriksa keberadaan kunci di dalam array, tanpa peduli isinya.
$data = [
'nama' => 'Budi',
'email' => null,
];
var_dump(isset($data['email'])); // bool(false)
var_dump(array_key_exists('email', $data)); // bool(true)
var_dump(isset($data['telepon'])); // bool(false)
var_dump(array_key_exists('telepon', $data)); // bool(false)
Baris terakhir memperlihatkan satu-satunya kondisi ketika keduanya sepakat: kunci yang memang tidak ada. Untuk nilai string, angka, atau array, dua fungsi ini memberi hasil identik. Selisih baru terlihat ketika nilai null masuk ke array, misalnya dari hasil query database atau input form yang kosong.
Kapan isset gagal menangkap null
Kolom database yang boleh null sering menghasilkan array dengan nilai null. Jika kamu memakai isset() untuk memeriksa apakah kolom tersebut diambil, hasilnya akan menyesatkan. Contohnya, saat mengambil satu baris pengguna dan ingin memastikan kolom telepon ada di hasil query:
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// Salah: dianggap tidak ada padahal kolomnya ada
if (isset($user['telepon'])) {
echo 'Kolom telepon tersedia';
}
// Benar: kunci ada, nilainya null
if (array_key_exists('telepon', $user)) {
echo 'Kolom telepon tersedia';
}
Kasus serupa muncul saat membangun fungsi yang membedakan “parameter tidak dikirim” dengan “parameter dikirim bernilai null”. API yang menerima null sebagai perintah menghapus data, misalnya, tidak bisa memakai isset() untuk membaca parameter itu.
Kinerja dan kebiasaan pemakaian
isset() adalah konstruksi bahasa, bukan fungsi biasa, sehingga sedikit lebih cepat dan bisa menerima beberapa variabel sekaligus dalam satu panggilan. array_key_exists() berupa fungsi biasa dan hanya menerima satu kunci per panggilan. Untuk array berisi puluhan ribu elemen yang diperiksa berulang dalam loop, selisih waktunya bisa terasa, tetapi pada ukuran data aplikasi web umum perbedaannya tidak berarti.
isset(): cepat, bisa multi-argumen, cocok ketika nilai null dianggap sama dengan tidak ada.array_key_exists(): lebih eksplisit soal keberadaan kunci, cocok ketika null adalah nilai yang sah.empty(): memeriksa kosong atau tidak, tetapi menganggap0,"", dannullsebagai kosong, jadi tidak cocok untuk sekadar cek kunci.- Null coalescing (
??): memberi nilai default ketika kunci tidak ada atau bernilai null, memakai aturan yang sama denganisset().
Pembahasan lebih luas soal perbedaan isset, empty, dan null coalescing di PHP membantu memetakan kapan masing-masing dipakai dalam kondisi input form yang bervariasi.
Penggunaan di dalam validasi form
Ketika membaca data kiriman form, kunci yang tidak terkirim dan kunci yang terkirim dengan nilai kosong punya arti berbeda. Checkbox yang tidak dicentang tidak dikirim sama sekali, sedangkan kolom teks yang dibiarkan kosong tetap terkirim sebagai string kosong. isset() cukup untuk checkbox karena nilai yang tidak dikirim memang berarti false. Untuk kolom teks, pemeriksaan keberadaan kunci jarang diperlukan; yang lebih berguna adalah memeriksa panjang string setelah trim.
// Checkbox: cukup pakai isset
$setuju = isset($_POST['setuju']);
// Teks: cek nilai, bukan keberadaan kunci
$nama = trim($_POST['nama'] ?? '');
if ($nama === '') {
$errors[] = 'Nama wajib diisi';
}
Pola seperti ini sejalan dengan cara menangani form input PHP untuk pemula yang menekankan pemeriksaan nilai ketimbang sekadar keberadaan kunci.
Pilihan untuk struktur bertingkat
Array bertingkat menuntut pemeriksaan berlapis sebelum mengakses elemen dalam. Menggabungkan isset() pada setiap tingkat lebih ringkas dan aman dari error “undefined index”:
if (isset($config['database']['host'])) {
$host = $config['database']['host'];
}
Versi array_key_exists() untuk kasus yang sama harus dipanggil dua kali dan tetap bisa memicu peringatan jika $config['database'] bukan array. Untuk konfigurasi yang nilainya tidak pernah null, isset() atau null coalescing bertingkat sudah mencukupi. Pertimbangkan array_key_exists() hanya ketika salah satu tingkat memang boleh bernilai null dan kamu perlu membedakannya.
Membandingkan ketiga pendekatan
| Kebutuhan | isset() | array_key_exists() | ?? (null coalescing) |
|---|---|---|---|
| Kunci ada, nilai bukan null | true | true | nilai dipakai |
| Kunci ada, nilai null | false | true | default dipakai |
| Kunci tidak ada | false | false | default dipakai |
| Bisa multi-kunci | ya | tidak | tidak |
Dari tabel ini, aturan praktisnya sederhana. Gunakan array_key_exists() saat null punya makna khusus dalam data, misalnya kolom opsional atau parameter API. Gunakan isset() atau ?? untuk hampir semua kasus lain, termasuk membaca input form dan konfigurasi. Jika kamu memakai jQuery di sisi klien untuk memeriksa elemen sebelum mengirim data, pola serupa juga berlaku pada pemilihan selector jQuery: pilih pemeriksaan yang paling spesifik dengan kebutuhan.
Untuk validasi menyeluruh, membandingkan pendekatan di sisi server dan klien lewat perbandingan validasi form PHP vs jQuery membantu memastikan keduanya tidak saling bertentangan. Di sisi server, pastikan juga tipe data yang diterima sesuai sebelum memutuskan fungsi pemeriksaan kunci.
Ringkasan
array_key_exists() adalah pilihan ketika nilai null harus dianggap sebagai data yang sah. Untuk kebutuhan lain, isset() dan null coalescing lebih ringkas dan lebih cepat. Tentukan lebih dulu apakah null bermakna khusus di dalam data yang kamu proses, lalu pilih fungsi yang sesuai dengan aturan itu.
Pertanyaan yang Sering Diajukan
Apakah array_key_exists bisa dipakai pada objek?
Tidak. Fungsi ini khusus untuk array. Untuk memeriksa properti objek, pakai property_exists() atau isset() pada properti tersebut.
Mengapa isset mengembalikan false padahal kunci array ada?
Karena nilai pada kunci itu null. isset() menganggap elemen bernilai null sebagai tidak ada. Gunakan array_key_exists() jika kamu perlu memastikan kunci benar-benar ada.
Apakah null coalescing bisa menggantikan array_key_exists?
Hanya sebagian. ?? mengikuti aturan isset(), jadi nilai null akan diganti dengan default. Jika kamu perlu membedakan null dari tidak ada, array_key_exists() tetap diperlukan.