二维数组排序

为了更灵活地控制排序字段和排序顺序,可以修改 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 方法获取并打印排序后的数据。

通过这种方式,排序逻辑更为灵活,可以根据需要指定排序字段和排序顺序,适用于多种场景。

posted @ 2024-05-16 08:50  xingduo  阅读(5)  评论(0编辑  收藏  举报