php неправильный результат сортировка по дате - PullRequest
1 голос
/ 24 марта 2011

Я сортирую массив как:

function date_compare($a, $b)
{
    $t1 = strtotime($a['date']);
    $t2 = strtotime($b['date']);
    return $t1 - $t2;
}    
usort($array, 'date_compare');

Однако, как вы можете видеть на выходе ниже, даты не сортируются. Есть идеи почему? Спасибо

Array
(
    [0] => Array
        (
            [id] => 16870
            [date] => Tue, 22 Mar 2011 13:12:19 +1100
            [bar] => Foo
        )

    [1] => Array
        (
            [id] => 16871
            [bar] => foo
            [date] => Mon, 21 Mar 2011 23:06:32 -0500 (CDT)
        )

    [2] => Array
        (
            [id] => 16872
            [bar] => foo
            [date] => Tue, 22 Mar 2011 00:37:01 -0500 (CDT)
        )
}

Ответы [ 2 ]

4 голосов
/ 24 марта 2011

Они отсортированы просто отлично, если принять во внимание часовой пояс, что strtotime делает.

0 голосов
/ 24 марта 2011

Как уже отмечали другие, даты сортируются должным образом.Вы можете сделать что-то вроде:

foreach ($dates as $i => $date)
{
  $dates[$i]['ts'] = strtotime($date['date']);
  $dates[$i]['date'] = date('Y-m-d H:i:s', $dates[$i]['ts']);
}

usort($dates, function($a, $b) { return $a['ts'] - $b['ts']; });

Здесь я создаю свойство ts для каждой даты, поэтому strtotime() не нужно вызывать дважды для сравнения сортировки.Во-вторых, я меняю дату, чтобы быть в местном часовом поясе.Вы можете настроить форматную строку по своему усмотрению.

В качестве альтернативы, вы можете просто unset() date компонент массива и вызывать date() непосредственно для компонента ts, когда вы хотите напечатать,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...