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

PHP 多維數組按指定鍵值排序:uasort + 自定義比較函數實戰

     編輯:PHP 綜合知識

場景

後端獲取菜單、導航、商品列表等數據,需按 `order`、`sort`、`weight` 等字段排序後輸出前端。

核心方案:uasort() 保持鍵名關聯

 ['name' => '首頁',      'order' => 3],
    'intro'    => ['name' => '企業概況',  'order' => 2],
    'news'     => ['name' => '新聞動態',  'order' => 1],
    'product'  => ['name' => '產品中心',  'order' => 4],
    'message'  => ['name' => '訪客留言',  'order' => 7],
    'position' => ['name' => '人才招聘',  'order' => 6],
    'contact'  => ['name' => '聯系我們',  'order' => 5],
];

// 升序排序(order 小 → 大)
uasort($menu, function ($a, $b) {
    return $a['order'] <=> $b['order']; // PHP 7+ 太空船操作符
    // 兼容寫法:return $a['order'] - $b['order'];
});

print_r($menu);

輸出結果

Array
(
    [news]     => Array ( [name] => 新聞動態  [order] => 1 )
    [intro]    => Array ( [name] => 企業概況  [order] => 2 )
    [index]    => Array ( [name] => 首頁      [order] => 3 )
    [product]  => Array ( [name] => 產品中心  [order] => 4 )
    [contact]  => Array ( [name] => 聯系我們  [order] => 5 )
    [position] => Array ( [name] => 人才招聘  [order] => 6 )
    [message]  => Array ( [name] => 訪客留言  [order] => 7 )
)

進階封裝:通用多維排序函數

/**
 * 多維數組按指定鍵排序
 * @param array  $array    目標數組(引用)
 * @param string $key      排序鍵名
 * @param int    $order    SORT_ASC(升序) | SORT_DESC(降序)
 * @param int    $flags    SORT_REGULAR | SORT_NUMERIC | SORT_STRING
 * @return bool
 */
function array_multisort_by_key(array &$array, string $key, int $order = SORT_ASC, int $flags = SORT_REGULAR): bool {
    if (empty($array) || !isset($array[array_key_first($array)][$key])) {
        return false;
    }
    
    uasort($array, function ($a, $b) use ($key, $order, $flags) {
        $cmp = 0;
        switch ($flags) {
            case SORT_NUMERIC:
                $cmp = ($a[$key] ?? 0) <=> ($b[$key] ?? 0);
                break;
            case SORT_STRING:
                $cmp = strcmp((string)($a[$key] ?? ''), (string)($b[$key] ?? ''));
                break;
            default:
                $cmp = ($a[$key] ?? null) <=> ($b[$key] ?? null);
        }
        return $order === SORT_DESC ? -$cmp : $cmp;
    });
    return true;
}

// 使用示例
$products = [
    ['id'=>1, 'price'=>99.9, 'sales'=>100],
    ['id'=>2, 'price'=>199.0, 'sales'=>50],
    ['id'=>3, 'price'=>49.5, 'sales'=>200],
];

array_multisort_by_key($products, 'price', SORT_ASC, SORT_NUMERIC); // 價格升序
array_multisort_by_key($products, 'sales', SORT_DESC, SORT_NUMERIC); // 銷量降序

多字段複合排序

// 先按分類升序,再按價格降序
uasort($goods, function ($a, $b) {
    $catCmp = ($a['category'] ?? '') <=> ($b['category'] ?? '');
    if ($catCmp !== 0) return $catCmp;
    return - (($a['price'] ?? 0) <=> ($b['price'] ?? 0)); // 價格降序取負
});

性能對比與選擇建議

函數是否保持鍵名適用場景複雜度
sort()❌ 重建索引純索引數組值排序O(n log n)
asort()✅ 保持鍵名關聯數組值排序O(n log n)
ksort()✅ 保持鍵名按鍵名排序O(n log n)
uasort()✅ 保持鍵名自定義邏輯排序(最靈活)O(n log n)
array_multisort()❌/✅ 視參數多數組/多維同步排序O(n log n)

避坑指南

  1. 太空船操作符 `<=>` 要求 PHP 7.0+,舊版本用減法或 `strcmp`
  2. 鍵不存在處理:比較函數中用 `??` 提供默認值,避免 Notice
  3. 引用傳遞:`uasort` 直接修改原數組,無返回值(返回 bool)
  4. 穩定排序:PHP 8.0+ 排序算法為穩定排序,相同值保持原相對順序

掌握 uasort + 閉包比較函數,即可靈活應對各種多維數組排序需求,代碼簡潔且性能優異。

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