首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列查詢與自定義排序實戰

     編輯:PHP 相關知識

陣列查詢核心函數

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])檢查鍵存在且非 nullbool語言結構,非函數最快,但 null 值會誤判

自定義排序:usort / uasort / uksort

當內建排序無法滿足複雜業務邏輯(如多欄位排序、自然語言排序、權重計算),需使用回調函數自定義比較規則。

比較函數規範

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)
*/
?>

效能優化建議

  1. 大陣列查詢:頻繁 in_array 改用 array_flip 反轉鍵值,或建立 isset($lookup[$val]) 雜湊查找 O(1)
  2. 排序穩定性:PHP 8.0+ 排序函數穩定,舊版本相等元素順序不保證
  3. 避免重複計算:比較函數內避免重複計算,預先提取排序欄位
  4. 記憶體考量:usort 原地排序,大陣列注意記憶體峰值

善用自定義排序配合太空船運算子,能優雅解決複雜多欄位排序需求,是 PHP 開發進階的關鍵技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved