首页 > 其他分享 >二维数组排序

二维数组排序

时间:2024-05-16 08:57:31浏览次数:17  
标签:00 DataSorter 二维 数组 time 排序 data

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

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

标签:00,DataSorter,二维,数组,time,排序,data
From: https://www.cnblogs.com/zxingduo/p/18195246

相关文章

  • 排序、过滤、分页
    排序、过滤、分页1.排序1.1使用条件#必须是查询所有接口--》restful规范中:地址栏中带过滤条件 http://127.0.0.1:8008/app01/api/v1/books/?ordering=price#必须是继承GenericAPIView的视图类---》继承APIView是不能这么配置的1.2使用排序#1.引入相关排序相关......
  • 108. 将有序数组转换为二叉搜索树(leetcode)
    https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/要点是分割左右区间,并且分割时需要注意left和right相加可能会超过int,但是本题不需要classSolution{publicTreeNodesortedArrayToBST(int[]nums){//有返回值写法......
  • shell函数和数组
    函数定义函数##第一种:简单常用函数名(){脚本(命令集合)}##第二种:function函数名{脚本内容(命令集合)}##第三种function函数名(){脚本(命令集合)}函数使用#!/bin/bashnum(){##num是定义的函数名称a=66echo${a}}num##这里的num是调用上面的num函数......
  • 数组和List互转
    数组转List数组转List,使用JDK中java.util.Arrays工具类的asList方法。importjava.util.Arrays;importjava.util.List;publicclassMain{publicstaticvoidmain(String[]args){String[]strs={"aaa","bbb","ccc"};List......
  • jquery使用$.grep删除数组中的某个值
    vararr=[1,2,3,4,5];varvalueToRemove=3;//方法1:使用$.grep()方法arr=$.grep(arr,function(value){returnvalue!=valueToRemove;});console.log(arr);//[1,2,4,5]//方法2:使用Array.prototype.filter()方法(纯JavaScript)arr=arr.fi......
  • 创建二维动态数组
    1//#include<bits/stdc++.h>2#include<iostream>3#include<vector>4usingnamespacestd;5intmain(){6intn;7cin>>n;8//writeyourcodehere......910////1.使用一维数组模拟11//int*num=......
  • Vue数组变化的侦测的学习
    数组的监听有两种方法变更方法和替换数组####两者的区别就是变更方法会引起ui的自动更新即直接会显示在页面上,但是替换数组不会,变更方法push()pop()shift()unshift()splice()sort()reverse()替换数组concat()filter()slice()如何实现替换数组相当于是变更方法......
  • 常见的排序算法——归并排序(三)
    本文记述了归并排序的3项改进和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想本文实现了《算法(第4版)》书中提到的3项改进,对小规模子数组使用插入排序。减少在小规模数组中的递归调用能改进整个算法。测试数组是否已经有序。任意有序的子数组算法......
  • 使用ZXing.Net生成二维码
    所需依赖组件从工程安装的ZXing.NetNuget包查看,ZXing.Net不依赖其他组件。查看package包内容,发现内部就zxing.dll和zxing.presentation.dll两个动态库文件。ZXing.Net生成的二维码形式生成的二维码形式为内存Bitmap图像对象,如果需保存为文件或Base64字符串需另外书写代码实......
  • Tree树组件格式化数据、获取所有数据数组
     格式化树数据:functionreplaceNameWithTitle(data){//遍历数据数组returndata.map(item=>{//复制当前对象,以免修改原始数据constnewItem={...item};//将name属性替换为titlenewItem......