array_key_exists($key, $array)用於檢查指定的$key是否存在於$array中。如果$key存在,則返回true ,否則返回false 。
這個函數的優勢在於它會考慮到數組中所有的鍵,不管值是null或者是false ,都可以正確判斷。例如:
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">0</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-string">'a'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)); </span><span><span class="hljs-comment">// true</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-string">'b'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)); </span><span><span class="hljs-comment">// true</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-string">'c'</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)); </span><span><span class="hljs-comment">// false</span></span><span>
</span></span>當你在一個循環中頻繁調用array_key_exists時,它可能會對性能產生負面影響,尤其是在處理大數組時。原因如下:
查找操作的時間複雜度: array_key_exists的查找操作時間複雜度是O(1),這意味著它在每次查找時的效率是常數級別的。但如果你在循環中進行多次調用,這個常數時間可能會累加,尤其是在循環次數非常大的情況下。
重複檢查相同的鍵:如果在一個循環裡對同一個數組進行多次鍵存在性檢查,PHP 會重複執行這些檢查,浪費了不必要的計算資源。
舉個例子:
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">array_key_exists</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$array</span></span><span>)) {
</span><span><span class="hljs-comment">// 執行某些操作</span></span><span>
}
}
</span></span>在上面的代碼中, array_key_exists在每次循環時都會被調用,而在這個特定的場景下, $key在數組中肯定存在,因此這種檢查是多餘的。
針對上述性能問題,下面提出幾種優化方案。
如果你已經知道數組的鍵是存在的,完全不需要再次檢查。例如,直接使用循環中的$key即可,無需調用array_key_exists 。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// 直接使用 $key,避免調用 array_key_exists</span></span><span>
</span><span><span class="hljs-comment">// 執行某些操作</span></span><span>
}
</span></span>如果需要在循環中檢查多個鍵的存在性,可以在循環外部先獲取數組的所有鍵,然後通過in_array或其他方式進行一次性檢查。這避免了多次調用array_key_exists 。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-variable">$keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>); </span><span><span class="hljs-comment">// 獲取所有的鍵</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$keys</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span>) {
</span><span><span class="hljs-comment">// 可以直接操作 $array[$key]</span></span><span>
}
</span></span>isset()是一個常用的函數,通常用於檢查數組中的值是否為null或未定義。如果你只關心鍵是否存在,並且值不為null ,使用isset()會比array_key_exists更高效,因為isset()直接檢查數組值是否設置,而array_key_exists會檢查是否有該鍵,甚至考慮null值。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>])) {
</span><span><span class="hljs-comment">// 執行某些操作</span></span><span>
}
}
</span></span>在一些特殊的場景下,如果數組非常龐大,性能問題可能不僅僅是array_key_exists的問題,而是與數據結構本身的選擇有關。在這種情況下,你可以考慮使用其他數據結構,比如SplObjectStorage或者其他哈希表,這些數據結構在性能方面可能有更好的表現。
雖然array_key_exists是一個非常實用的函數,但在循環中頻繁調用它可能會影響性能。通過避免重複檢查、提前提取鍵、選擇合適的函數(如isset )以及使用合適的數據結構,可以有效提升PHP 代碼的執行效率。在實際開發中,務必根據具體的應用場景來選擇最優的解決方案,以確保程序在處理大量數據時仍然保持高效。