为了更灵活地控制排序字段和排序顺序,可以修改 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
方法获取并打印排序后的数据。
- 创建示例二维数组
通过这种方式,排序逻辑更为灵活,可以根据需要指定排序字段和排序顺序,适用于多种场景。
标签:00,DataSorter,二维,数组,time,排序,data From: https://www.cnblogs.com/zxingduo/p/18195246