array_key_exists() 是 PHP 判斷數組中是否存在指定鍵名的核心函數。本文從原理、性能、與 isset()/in_array() 差異三個維度深度解析,助你在高頻調用場景做出最優選擇。
bool array_key_exists( mixed $key, array $array )
true 若鍵名存在(無論值為何,包括 null、false、'')false 若鍵名不存在$a = ['a' => 'Dog', 'b' => 'Cat'];
var_dump(array_key_exists('a', $a)); // true
var_dump(array_key_exists('c', $a)); // false
array_key_exists vs isset() vs in_array()| 特性 | array_key_exists() | isset() | in_array() |
|---|---|---|---|
| 檢查對象 | 鍵名 | 變量是否存在且非 null | 值 |
值為 null 時 | true (鍵存在) | false (視同未設置) | true (若值在陣列中) |
值為 '' / false / 0 | true | true | true |
| 鍵名不存在 | false | false (不觸發 Notice) | false |
| 執行效率 | O(1) 哈希查找 | O(1) 語言結構,最快 | O(n) 線性遍歷 |
| 語言層級 | 內置函數 | 語言結構 | 內置函數 |
| 適用場景 | 需確認鍵名存在,包含 null 值 | 通用變量/陣列元素存在性檢查 | 需查找特定值 |
$test_arr = ['aa' => 'dd', 'bb' => '', 'cc' => null, 'dd' => false];
function microtime_float() {
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
}
$start = microtime_float();
for ($i=0; $i<1000000; $i++) isset($test_arr['aa']);
echo "isset 1,000,000: " . (microtime_float() - $start) . "s\n";
$start = microtime_float();
for ($i=0; $i<1000000; $i++) array_key_exists('aa', $test_arr);
echo "array_key_exists 1,000,000: " . (microtime_float() - $start) . "s\n";
$start = microtime_float();
for ($i=0; $i<1000000; $i++) in_array('dd', $test_arr);
echo "in_array 1,000,000: " . (microtime_float() - $start) . "s\n";
/*
典型輸出 (PHP 7.4+):
isset 1,000,000: 0.012s
array_key_exists 1,000,000: 0.028s
in_array 1,000,000: 0.185s
*/
結論:isset() 最快(語言結構),array_key_exists() 次之(函數調用開銷),in_array() 最慢(線性掃描)。高頻熱路徑優先 isset(),需區分 null 值時用 array_key_exists()。
get_defined_vars() 配合檢查變量是否定義array_key_exists() 可用於檢查當前作用域變量是否定義:
$defined = get_defined_vars();
if ( array_key_exists('myVar', $defined) ) {
// $myVar 已定義(即使值為 null)
}
isset($arr[$key]) (最快、最常用)array_key_exists($key, $arr)array_key_exists('varName', get_defined_vars())in_array($value, $arr, true) (嚴格模式)array_flip($arr) 反轉後用 isset(),或改用 SplFixedArray/Map 結構isset() 判斷鍵名存在:值為 null 時返回 false,導致邏輯錯誤。in_array() 判斷鍵名:in_array() 遍歷的是值,且未指定 strict 參數時會發生類型轉換(如 '0' == 0 為 true)。array_key_exists('A', $arr) 不會匹配 'a'。理解本質差異,根據業務語義選擇正確函數,是編寫健壯高效 PHP 代碼的關鍵細節。