PHP 提供超過 30 個陣列相關函數,查詢類函數是最高頻操作。掌握 in_array()、array_search()、array_key_exists() 等函數的效能差異與適用場景,能避免常見效能陷阱。
| 函數 | 用途 | 回傳值 | 嚴格模式 | 效能備註 |
|---|---|---|---|---|
in_array($needle, $haystack, $strict) | 檢查值是否存在 | bool | 第三參數 true 啟用型別比較 | O(n) 線性搜尋,大陣列慎用 |
array_search($needle, $haystack, $strict) | 找值對應的鍵 | key|false | 同上 | 同 in_array,找到即返回 |
array_key_exists($key, $arr) | 檢查鍵是否存在 | bool | 鍵名嚴格比較 | O(1) 雜湊查找,極快 |
isset($arr[$key]) | 檢查鍵存在且非 null | bool | 語言結構,非函數 | 最快,但 null 值會誤判 |
當內建排序無法滿足複雜業務邏輯(如多欄位排序、自然語言排序、權重計算),需使用回調函數自定義比較規則。
function cmp($a, $b): int {
// 回傳:負數 = $a < $b, 0 = 相等, 正數 = $a > $b
// PHP 7+ 可用太空船運算子 <=>
return $a <=> $b;
}
| 函數 | 排序依據 | 鍵名保留 | 適用場景 |
|---|---|---|---|
usort() | 值 | 否 (重建 0..n) | 索引陣列、不需保留鍵 |
uasort() | 值 | 是 | 關聯陣列、需保留鍵值對應 |
uksort() | 鍵 | 是 | 依鍵名自定義排序 |
<?php
$users = [
['name' => '張三', 'age' => 25, 'score' => 88],
['name' => '李四', 'age' => 22, 'score' => 95],
['name' => '王五', 'age' => 25, 'score' => 90],
['name' => '趙六', 'age' => 28, 'score' => 88],
];
// 需求:分數降序,分數相同年齡升序,再相同按姓名字典序
uasort($users, function($a, $b) {
// 分數降序
if ($b['score'] !== $a['score']) return $b['score'] <=> $a['score'];
// 年齡升序
if ($a['age'] !== $b['age']) return $a['age'] <=> $b['age'];
// 姓名字典序
return strcmp($a['name'], $b['name']);
});
print_r($users);
/*
結果:
李四 (95, 22)
王五 (90, 25)
張三 (88, 25)
趙六 (88, 28)
*/
?>
in_array 改用 array_flip 反轉鍵值,或建立 isset($lookup[$val]) 雜湊查找 O(1)usort 原地排序,大陣列注意記憶體峰值善用自定義排序配合太空船運算子,能優雅解決複雜多欄位排序需求,是 PHP 開發進階的關鍵技能。