按日期时间排序的数组不适用于新月

时间:2017-02-03 11:20:53

标签: php arrays sorting datetime associative-array

我有一个像这样的数组和数组排序函数,可以根据日期和时间的键值对数组进行排序。如果所有数组元素中的日期时间值来自同一个月,则该函数可以正常工作。就像我有这个数组。

(
[0] => Array
    (
        [datetime] => 03/02/2017 07:54
        [status] => Volume saiu da plataforma da 
        [status_id] => 
        [date] => 03/02/2017
        [location] => Coslada (Madrid)-Espanha
        [time] => 07:54
    )

[1] => Array
    (
        [datetime] => 03/02/2017 07:52
        [status] => O volume chegou à Plataforma da .
        [status_id] => 
        [date] => 03/02/2017
        [location] => Coslada (Madrid)-Espanha
        [time] => 07:52
    )

[2] => Array
    (
        [datetime] => 02/02/2017 16:27
        [status] => Volume saiu da plataforma da 
        [status_id] => 
        [date] => 02/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 16:27
    )

[3] => Array
    (
        [datetime] => 02/02/2017 16:26
        [status] => Volume saiu da plataforma da 
        [status_id] => 
        [date] => 02/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 16:26
    )

[4] => Array
    (
        [datetime] => 01/02/2017 20:15
        [status] => Os dados do volume foram introduzidos no sistema .
        [status_id] => 
        [date] => 01/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 20:15
    )

[5] => Array
    (
        [datetime] => 01/02/2017 00:00
        [status] => Os dados do volume foram introduzidos no sistema \3B o volume ainda não foi entregue à .
        [status_id] => 
        [date] => 01/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 00:00
    )

[6] => Array
    (
        [datetime] => 02/02/2017 19:27
        [status] => Encomenda transferida: Chegará a Italy em breve
        [status_id] => 6
        [date] => 02/02/2017
        [location] => Portugal
        [time] => 19:27
    )

[7] => Array
    (
        [datetime] => 01/02/2017 16:25
        [status] => Encomenda recebida pela Delnext. Em preparação para ser enviada.
        [status_id] => 2
        [date] => 01/02/2017
        [location] => Portugal
        [time] => 16:25
    )

[8] => Array
    (
        [datetime] => 29/01/2017 13:17
        [status] => Encomenda em processo de recolha
        [status_id] => 13
        [date] => 29/01/2017
        [location] => Spain
        [time] => 13:17
    )

[9] => Array
    (
        [datetime] => 29/01/2017 13:16
        [status] => Pendente
        [status_id] => 1
        [date] => 29/01/2017
        [location] => Spain
        [time] => 13:16
    )

)

这是我的函数,它根据日期时间值对数组进行排序。

usort($second_tracking_array, 'date_compare');
function date_compare($a, $b) {

    define('AMERICAN_DATE_FORMAT', 'm/d/Y G:i');
    $a['datetime'] = trim($a['datetime']);
    $b['datetime'] = trim($b['datetime']);
    $date1 = DateTime::createFromFormat(AMERICAN_DATE_FORMAT, $a['datetime'])->getTimestamp();
    $date2 = DateTime::createFromFormat(AMERICAN_DATE_FORMAT, $b['datetime'])->getTimestamp();
    return $date2 - $date1;
}

如果所有月份相同但该数组包含来自不同月份的日期时间,则该函数会对数组进行完美排序。它并不好。 下面是函数执行后的结果数组。

(
    [0] => Array
    (
        [datetime] => 29/01/2017 13:17
        [status] => Encomenda em processo de recolha
        [status_id] => 13
        [date] => 29/01/2017
        [location] => Spain
        [time] => 13:17
    )

[1] => Array
    (
        [datetime] => 29/01/2017 13:16
        [status] => Pendente
        [status_id] => 1
        [date] => 29/01/2017
        [location] => Spain
        [time] => 13:16
    )

[2] => Array
    (
        [datetime] => 03/02/2017 07:54
        [status] => Volume saiu da plataforma da 
        [status_id] => 
        [date] => 03/02/2017
        [location] => Coslada (Madrid)-Espanha
        [time] => 07:54
    )

[3] => Array
    (
        [datetime] => 03/02/2017 07:52
        [status] => O volume chegou à Plataforma da .
        [status_id] => 
        [date] => 03/02/2017
        [location] => Coslada (Madrid)-Espanha
        [time] => 07:52
    )

[4] => Array
    (
        [datetime] => 02/02/2017 19:27
        [status] => Encomenda transferida: Chegará a Italy em breve
        [status_id] => 6
        [date] => 02/02/2017
        [location] => Portugal
        [time] => 19:27
    )

[5] => Array
    (
        [datetime] => 02/02/2017 16:27
        [status] => Volume saiu da plataforma da 
        [status_id] => 
        [date] => 02/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 16:27
    )

[6] => Array
    (
        [datetime] => 02/02/2017 16:26
        [status] => Volume saiu da plataforma da 
        [status_id] => 
        [date] => 02/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 16:26
    )

[7] => Array
    (
        [datetime] => 01/02/2017 20:15
        [status] => Os dados do volume foram introduzidos no sistema .
        [status_id] => 
        [date] => 01/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 20:15
    )

[8] => Array
    (
        [datetime] => 01/02/2017 16:25
        [status] => Encomenda recebida pela Delnext. Em preparação para ser enviada.
        [status_id] => 2
        [date] => 01/02/2017
        [location] => Portugal
        [time] => 16:25
    )

[9] => Array
    (
        [datetime] => 01/02/2017 00:00
        [status] => Os dados do volume foram introduzidos no sistema \3B o volume ainda não foi entregue à .
        [status_id] => 
        [date] => 01/02/2017
        [location] => Venda do Pinheiro-Portugal
        [time] => 00:00
    )

)

1 个答案:

答案 0 :(得分:0)

将usort()函数与自定义comarator一起使用:

$arr = array(...);

usort($arr, function($a, $b) {
  $val1 = new DateTime($a['dateTime']);
  $val2= new DateTime($b['dateTime']);

  if ($val1 == $val2) {
    return 0;
  }

  return $val1 < $val2 ? -1 : 1;
});