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

PHP 二維陣列指定鍵值排序通用函數(支援升降序、多鍵擴展)

     編輯:PHP 綜合知識

核心函數

<?php
/**
 * 二維陣列按指定鍵排序
 * @param array  $arr   待排序陣列
 * @param string $key   排序依據的鍵名
 * @param string $order 'asc' 升序 | 'desc' 降序
 * @return array 排序後的陣列(保留原鍵)
 */
function array_sort($arr, $key, $order = 'asc') {
    if (empty($arr) || !is_array($arr)) return $arr;

    // 1. 提取排序鍵值
    $keyValues = [];
    foreach ($arr as $k => $v) {
        if (!isset($v[$key])) continue; // 跳過缺鍵項
        $keyValues[$k] = $v[$key];
    }

    // 2. 排序鍵值陣列(保持索引關聯)
    if ($order === 'asc') {
        asort($keyValues, SORT_REGULAR);
    } else {
        arsort($keyValues, SORT_REGULAR);
    }

    // 3. 依排序後的索引重組原陣列
    $sorted = [];
    foreach ($keyValues as $k => $v) {
        $sorted[$k] = $arr[$k];
    }
    return $sorted;
}
?>

使用範例

<?php
$products = [
    101 => ['name' => '筆電', 'price' => 35000, 'stock' => 10],
    102 => ['name' => '滑鼠', 'price' => 500,   'stock' => 200],
    103 => ['name' => '螢幕', 'price' => 8000,  'stock' => 30],
    104 => ['name' => '鍵盤', 'price' => 1200,  'stock' => 50],
];

// 價格升序
$byPriceAsc = array_sort($products, 'price', 'asc');
/*
102 => ['name' => '滑鼠', 'price' => 500, ...]
104 => ['name' => '鍵盤', 'price' => 1200, ...]
103 => ['name' => '螢幕', 'price' => 8000, ...]
101 => ['name' => '筆電', 'price' => 35000, ...]
*/

// 庫存降序
$byStockDesc = array_sort($products, 'stock', 'desc');
/*
102 => ['name' => '滑鼠', 'stock' => 200, ...]
104 => ['name' => '鍵盤', 'stock' => 50, ...]
103 => ['name' => '螢幕', 'stock' => 30, ...]
101 => ['name' => '筆電', 'stock' => 10, ...]
*/
?>

進階:多鍵排序(如價格升序、庫存降序)

<?php
function array_multisort_keys(array $arr, array $criteria) {
    // $criteria = [['key' => 'price', 'order' => 'asc'], ['key' => 'stock', 'order' => 'desc']]
    $sortArrays = [];
    foreach ($criteria as $c) {
        $vals = array_column($arr, $c['key']);
        $sortArrays[] = $vals;
        $sortArrays[] = $c['order'] === 'asc' ? SORT_ASC : SORT_DESC;
    }
    $sortArrays[] = &$arr; // 最後引用原陣列
    array_multisort(...$sortArrays);
    return $arr;
}

$multi = array_multisort_keys($products, [
    ['key' => 'price', 'order' => 'asc'],
    ['key' => 'stock', 'order' => 'desc'],
]);
?>

效能與替代方案

方法時間複雜度記憶體適用場景
array_sort() (本文)O(n log n)O(n)單鍵排序,保留原鍵
array_multisort() 原生O(n log n)O(n)多鍵排序,官方推薦
usort() 自定義比較O(n log n)O(1)複雜邏輯(如日期字串、多欄位混合)
SQL ORDER BYDB 引擎優化不佔 PHP 記憶體資料源頭即可排序時(首選)

常見錯誤

  • 直接用 sort():會重置數字索引,丟失原鍵關聯
  • 鍵值型別不一致:字串 '100' vs 整數 100,排序結果不同,建議統一轉型
  • 缺鍵項未處理:會導致 Notice 或排序錯誤,函數中已用 isset() 過濾
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved