Сортировать значения массива по ключу даты сначала по ключу времени в PHP - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть этот многомерный массив:

[
    {
        "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");

У кого-нибудь есть решение для этого?Я уверен, что я миллионная, кто сделал это ...

Ответы [ 4 ]

2 голосов
/ 19 сентября 2019

Вы можете просто указать дату и время, а затем сравнить строку, это может сэкономить много работы.

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

usort($result_array,'cmp');
1 голос
/ 19 сентября 2019

Упорядочение по дате и времени по возрастанию с оператором космического корабля (я переупорядочил ваши исходные данные, потому что они выглядели уже отсортированными):

<?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',
  ),
)
1 голос
/ 19 сентября 2019

Вы были почти там.Добавьте время 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");
0 голосов
/ 19 сентября 2019

Я нашел кое-что здесь: Сортировать массив по нескольким критериям в 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...