二維陣列排序

xingduo發表於2024-05-16

為了更靈活地控制排序欄位和排序順序,可以修改 DataSorter 類,使其能夠透過引數指定排序欄位和排序順序。以下是實現方法:

DataSorter 類

<?php
class DataSorter {
    /**
     * 按指定欄位和順序排序二維陣列
     * 
     * @param array $data 要排序的二維陣列
     * @param string $field 要排序的欄位
     * @param string $order 排序順序(asc 或 desc)
     * @return array 排序後的二維陣列
     */
    public static function sortByField(array $data, string $field, string $order = 'asc') {
        usort($data, function($a, $b) use ($field, $order) {
            // 獲取欄位值
            $valueA = $a[$field];
            $valueB = $b[$field];

            // 將時間欄位轉換為時間戳進行比較
            if (strtotime($valueA) !== false && strtotime($valueB) !== false) {
                $valueA = strtotime($valueA);
                $valueB = strtotime($valueB);
            }

            // 比較欄位值
            if ($valueA == $valueB) {
                return 0;
            }

            // 根據 order 引數決定升序或降序
            if ($order === 'asc') {
                return ($valueA < $valueB) ? -1 : 1;
            } else {
                return ($valueA > $valueB) ? -1 : 1;
            }
        });

        return $data;
    }
}
?>

SomeOtherClass 類

<?php
class SomeOtherClass {
    private $data;

    public function __construct($data) {
        $this->data = $data;
    }

    public function sortData($field, $order = 'asc') {
        // 呼叫 DataSorter 類的靜態方法進行排序
        $this->data = DataSorter::sortByField($this->data, $field, $order);
    }

    public function getData() {
        return $this->data;
    }
}

// 示例二維陣列
$data = [
    ['name' => 'Alice', 'time' => '2024-05-16 14:30:00'],
    ['name' => 'Bob', 'time' => '2024-05-15 08:00:00'],
    ['name' => 'Charlie', 'time' => '2024-05-16 09:45:00'],
    ['name' => 'Dave', 'time' => '2024-05-15 12:00:00'],
];

// 建立 SomeOtherClass 的例項
$instance = new SomeOtherClass($data);

// 按時間欄位升序排序
$instance->sortData('time', 'asc');

// 獲取並列印排序後的資料
$sortedData = $instance->getData();
print_r($sortedData);

// 按時間欄位降序排序
$instance->sortData('time', 'desc');

// 獲取並列印排序後的資料
$sortedData = $instance->getData();
print_r($sortedData);
?>

詳細說明

  1. DataSorter 類:

    • sortByField 方法:接收一個二維陣列 $data,一個排序欄位 $field,和一個排序順序 $order。預設排序順序為升序(asc)。
    • 使用 usort 函式和一個匿名比較函式對陣列進行排序。
    • 比較函式使用 $field 獲取要排序的欄位值。如果欄位值是時間格式,使用 strtotime 函式將其轉換為時間戳進行比較。
    • 根據 $order 引數決定是升序還是降序排序。
  2. SomeOtherClass 類:

    • 包含一個私有成員變數 $data 用於儲存陣列。
    • 建構函式 __construct 用於初始化陣列資料。
    • 方法 sortData 呼叫 DataSorter::sortByField 靜態方法來排序陣列,並接受排序欄位和排序順序作為引數。
    • 方法 getData 返回排序後的陣列。
  3. 使用示例:

    • 建立示例二維陣列 $data
    • 建立 SomeOtherClass 的例項並傳入示例資料。
    • 呼叫 sortData 方法按指定欄位和順序進行排序。
    • 呼叫 getData 方法獲取並列印排序後的資料。

透過這種方式,排序邏輯更為靈活,可以根據需要指定排序欄位和排序順序,適用於多種場景。

相關文章