為了更靈活地控制排序欄位和排序順序,可以修改 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);
?>
詳細說明
-
DataSorter 類:
sortByField
方法:接收一個二維陣列$data
,一個排序欄位$field
,和一個排序順序$order
。預設排序順序為升序(asc
)。- 使用
usort
函式和一個匿名比較函式對陣列進行排序。 - 比較函式使用
$field
獲取要排序的欄位值。如果欄位值是時間格式,使用strtotime
函式將其轉換為時間戳進行比較。 - 根據
$order
引數決定是升序還是降序排序。
-
SomeOtherClass 類:
- 包含一個私有成員變數
$data
用於儲存陣列。 - 建構函式
__construct
用於初始化陣列資料。 - 方法
sortData
呼叫DataSorter::sortByField
靜態方法來排序陣列,並接受排序欄位和排序順序作為引數。 - 方法
getData
返回排序後的陣列。
- 包含一個私有成員變數
-
使用示例:
- 建立示例二維陣列
$data
。 - 建立
SomeOtherClass
的例項並傳入示例資料。 - 呼叫
sortData
方法按指定欄位和順序進行排序。 - 呼叫
getData
方法獲取並列印排序後的資料。
- 建立示例二維陣列
透過這種方式,排序邏輯更為靈活,可以根據需要指定排序欄位和排序順序,適用於多種場景。