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

PHP 多維數組排序實戰:根據二維數組指定鍵值進行多條件排序

     編輯:PHP 綜合知識

前言

在 PHP 開發中,經常需要對多維數組進行排序。例如:根據二維數組中的某個欄位(如年齡、時間、次數)進行升序或降序排列。PHP 內建函數 array_multisort() 功能強大,但要求參與排序的數組長度一致。本文將通過實例講解如何靈活運用 array_multisort() 及自定義函數實現多維數組的多條件排序。

場景一:按多個欄位對二維數組排序

假設 $areaArray 是一個包含多個地區數據的二維數組,每個地區下又包含「人數」和「次數」兩個指標。我們需要先按「次數」降序,再按「人數」降序排序。

foreach ($areaArray as &$areas) {
    $times = $numbers = [];
    foreach ($areas as $province => $v) {
        $times[$province] = $v['times'];
        $numbers[$province] = $v['numbers'];
    }
    // 先按 $times 降序,再按 $numbers 降序,最後對 $areas 本身排序
    array_multisort($times, SORT_DESC, $numbers, SORT_DESC, $areas);
}

關鍵點:先提取需要排序的欄位組成獨立數組,保持鍵名一致,再作為 array_multisort() 的前幾個參數傳入,最後一個參數是原數組的引用。

場景二:通用的多維數組單鍵值排序函數

針對類似以下結構的數組:

$arr = [
    'd' => ['id' => 5, 'name' => 1, 'age' => 7],
    'b' => ['id' => 2, 'name' => 3, 'age' => 4],
    'a' => ['id' => 8, 'name' => 10, 'age' => 5],
    'c' => ['id' => 1, 'name' => 2, 'age' => 2],
];

我們需要按 age 升序排序。可以封裝一個通用函數:

function multi_array_sort($multi_array, $sort_key, $sort = SORT_ASC) {
    if (!is_array($multi_array)) return false;
    $key_array = [];
    foreach ($multi_array as $row_array) {
        if (!is_array($row_array) || !isset($row_array[$sort_key])) return false;
        $key_array[] = $row_array[$sort_key];
    }
    array_multisort($key_array, $sort, $multi_array);
    return $multi_array;
}

// 使用示例
$sorted = multi_array_sort($arr, 'age');
print_r($sorted);

輸出結果:

Array
(
    [c] => Array ( [id] => 1 [name] => 2 [age] => 2 )
    [b] => Array ( [id] => 2 [name] => 3 [age] => 4 )
    [a] => Array ( [id] => 8 [name] => 10 [age] => 5 )
    [d] => Array ( [id] => 5 [name] => 1 [age] => 7 )
)

總結

  • array_multisort() 可同時對多個數組或多維數組進行排序,關鍵在於構建與原數組鍵名對應的輔助數組。
  • 自定義函數 multi_array_sort() 封裝了提取鍵值、調用排序的邏輯,提高代碼複用性。
  • 排序標誌 SORT_ASC(升序)、SORT_DESC(降序)、SORT_NUMERIC(數值比較)、SORT_STRING(字符串比較)可根據數據類型靈活組合。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved