【问题标题】:Sort array values by date key first then by time key in PHP在 PHP 中先按日期键然后按时间键对数组值进行排序
【发布时间】:2020-01-20 13:57:07
【问题描述】:

我有这个多维数组:

[
    {
        "Id": 14,
        "ClassDate": "2019-09-20T00:00:00",
        "StartTime": "06:00:00"
    },
    {
        "Id": 27,
        "ClassDate": "2019-09-20T00:00:00",
        "StartTime": "07:45:00"
    },
    {
        "Id": 144,
        "ClassDate": "2019-09-21T00:00:00",
        "StartTime": "05:00:00"
    },
    {
        "Id": 170,
        "ClassDate": "2019-09-21T00:00:00",
        "StartTime": "08:45:00"
    },

]

我想按日期排序这个数组值,然后按时间排序相同的日期值。

这是我的代码,它只按日期对值进行排序

function cmp($a, $b) {
    $a = strtotime($a['ClassDate']);
    $b = strtotime($b['ClassDate']);

    if ($a == $b) {  return 0;  }
    return ($a < $b) ? -1 : 1;  
}   usort($result_array, "cmp");

有人对此有解决方案吗?我确信我是第 100 万个这样做的人......

【问题讨论】:

  • 我正在列出我想按降序显示课程的列表
  • 如果这两个项目的日期相同,那么你不能在那个时候返回 0,而是检查你的第二个标准,并以此为基础返回值。
  • (没有投票)对我来说一切都很好,除了需要计算时间的事情if ($a == $b) { return 0; }。将时间转换为秒,您就可以开始了。

标签: php arrays sorting date


【解决方案1】:

你可以只连接你的日期和时间,然后比较字符串,这样可以节省很多工作。

function cmp($a, $b){
    return strcmp($a["ClassDate"] . $a["StartTime"], $b["ClassDate"] . $b["StartTime"]);    
}

usort($result_array,'cmp');

【讨论】:

    【解决方案2】:

    你快到了。将时间StartTime 添加到您的ClassDate,然后进行比较以进行排序。

    function cmp($a, $b) {
        $a = date('Y-m-d H:i:s', strtotime($a['StartTime'], strtotime($a['ClassDate'])));
        $b = date('Y-m-d H:i:s', strtotime($b['StartTime'], strtotime($b['ClassDate'])));
    
        if ($a == $b) {  return 0;  }
        return ($a < $b) ? -1 : 1;  
    }   
    
    usort($result_array, "cmp");
    

    【讨论】:

    • 从未尝试过,但我认为 &lt;,&gt;,= 应该只适用于 DateTime 对象,因为 date() 会返回一个字符串。
    • 是的,你是对的,这将是一个字符串的比较,但是日期的格式是这样的,它可以工作。
    • 如果日期格式为YYYY-mm-ddTHH:ii:ss,它将完美运行,但假设您将格式更改为mm-dd-YYYYTHH:ii:ss,则不会。
    • It is a DateTime object, see the last outer function date。嗯,两者都不一样。见这里3v4l.org/cUEN5
    • @vivek_23,谢谢,这就是我能够比较的原因,
    【解决方案3】:

    使用飞船操作员按日期、时间升序排序(我重新排序了您的初始数据,因为它看起来已经排序):

    <?php
    
    $json=<<<JSON
    [
        {
            "Id": 170,
            "ClassDate": "2019-09-21T00:00:00",
            "StartTime": "08:45:00"
        },
        {
            "Id": 14,
            "ClassDate": "2019-09-20T00:00:00",
            "StartTime": "06:00:00"
        },
        {
            "Id": 144,
            "ClassDate": "2019-09-21T00:00:00",
            "StartTime": "05:00:00"
        },
        {
            "Id": 27,
            "ClassDate": "2019-09-20T00:00:00",
            "StartTime": "07:45:00"
        }
    ]
    JSON;
    
    $data = json_decode($json, true);
    
    function cmp($a, $b) {
        $a_date = $a['ClassDate'];
        $b_date = $b['ClassDate'];
        $a_time = $a['StartTime'];
        $b_time = $b['StartTime'];
    
        $cmp = $a_date <=> $b_date;
        if($cmp === 0)
            $cmp = $a_time <=> $b_time;
    
        return $cmp; 
    }
    
    usort($data, "cmp");
    var_export($data);
    

    输出:

    array (
      0 => 
      array (
        'Id' => 14,
        'ClassDate' => '2019-09-20T00:00:00',
        'StartTime' => '06:00:00',
      ),
      1 => 
      array (
        'Id' => 27,
        'ClassDate' => '2019-09-20T00:00:00',
        'StartTime' => '07:45:00',
      ),
      2 => 
      array (
        'Id' => 144,
        'ClassDate' => '2019-09-21T00:00:00',
        'StartTime' => '05:00:00',
      ),
      3 => 
      array (
        'Id' => 170,
        'ClassDate' => '2019-09-21T00:00:00',
        'StartTime' => '08:45:00',
      ),
    )
    

    【讨论】:

      【解决方案4】:

      我在这里找到了一些东西:Sort array using multiple criteria in PHP。并根据我的需要编辑了解决方案,这是可行的解决方案。使用 符号来获取升序/降序值。

      function order_by_score_endgame($a, $b){
         if ($a['ClassDate'] == $b['ClassDate'])
          {
            // score is the same, sort by endgame
            if ($a['StartTime'] > $b['StartTime']) return 1;
          }
          // sort the higher score first:
          return $a['ClassDate'] > $b['ClassDate'] ? 1 : -1;
         }
         usort($result_array, "order_by_score_endgame");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 2021-09-19
        • 2017-06-13
        • 2019-06-26
        相关资源
        最近更新 更多