檢查陣列鍵名是否存在,array_key_exists() 與 isset() 是兩大常用函數,但行為有關鍵差異:NULL 值處理、效能、適用對象。本文深度對比並給出選型建議。
| 場景 | array_key_exists() | isset() |
|---|---|---|
| 鍵存在,值為 NULL | true | false |
| 鍵存在,值非 NULL | true | true |
| 鍵不存在 | false | false |
| 適用對象 | 僅陣列 | 陣列、變數、物件屬性 |
| 效能 | 函數呼叫開銷 | 語言結構,極快 |
<?php
$arr = ['one' => '1', 'two' => '2', 'three' => null];
// array_key_exists:只檢查鍵
var_dump(array_key_exists('one', $arr)); // true
var_dump(array_key_exists('two', $arr)); // true
var_dump(array_key_exists('three', $arr)); // true ✅
// isset:檢查鍵且值非 NULL
var_dump(isset($arr['one'])); // true
var_dump(isset($arr['two'])); // true
var_dump(isset($arr['three'])); // false ❌
?>
<?php $arr = range(1, 1000); $start = microtime(true); for ($i = 0; $i < 10000000; $i++) isset($arr[500]); echo 'isset: ' . (microtime(true) - $start) . "s\n"; // ~0.35s $start = microtime(true); for ($i = 0; $i < 10000000; $i++) array_key_exists(500, $arr); echo 'array_key_exists: ' . (microtime(true) - $start) . "s\n"; // ~0.85s ?>
isset() 約快 2-3 倍(語言結構 vs 函數呼叫)。
array_key_exists()(如配置陣列、可選參數)。isset()(效能優、語法簡潔)。isset()(array_key_exists 不支援變數)。isset($obj->prop) 或 property_exists()(後者不檢查值)。<?php $value = $arr['key'] ?? 'default'; // 鍵不存在或值為 NULL 時用 default // 等同於: $value = isset($arr['key']) ? $arr['key'] : 'default'; ?>
「鍵存在但值為 NULL」是兩者分水嶺。理解業務語義:是「未設定」還是「明確設為 NULL」?選對函數,避免邏輯 Bug,效能加分。