Usort на массиве объектов DateTime в PHP - нет ошибок, массив не сортируется - PullRequest
2 голосов
/ 05 апреля 2019

У меня длинный многомерный массив, включающий некоторые объекты DateTime. Я хочу отсортировать весь массив на основе объекта [startdate]. Я использую эту функцию usort (на основе множества онлайн-ресурсов и модификаций от различных ошибок). Это не сортировка массива.

Мой массив отформатирован следующим образом. Показаны только начало для краткости.

Array
(
    [] => Array
        (
            [startdate] => DateTime Object
                (
                    [date] => 2019-04-10 19:00:00.000000
                    [timezone_type] => 3
                    [timezone] => America/New_York
                )

            [starttime] => DateTime Object
                (
                    [date] => 2019-04-10 19:00:00.000000
                    [timezone_type] => 3
                    [timezone] => America/New_York
                )

Вот мой код usort:

function date_compare($a, $b) {
    $t1 = $a["startdate"]->format('Y-m-d H:i:s');
    $t2 = $b["startdate"]->format('Y-m-d H:i:s');           
    return $t1 - $t2;
}    
usort($allEventsSimple, 'date_compare');

Я также попытался отсортировать объекты DateTime, используя этот код:

function date_compare($a, $b) {
    $t1 = var_dump($a[startdate]);
    $t2 = var_dump($b[startdate]);          
    return $t1 - $t2;
}    
usort($allEventsSimple, 'date_compare');

1 Ответ

1 голос
/ 05 апреля 2019

У вас действительно есть ошибки, вы просто не видите их (см. Как получить полезные сообщения об ошибках в PHP? )

Ваш код будет производить

Примечание PHP: Не правильно сформированное числовое значение встречается в ...

Это потому, что вы пытаетесь вычесть одну нечисловую строку из другой.

Если вы используете PHP 7, вы можете напрямую сравнить DateTime экземпляры с удивительно названным «оператором космического корабля» , например,

return $a['startdate'] <=> $b['startdate'];

enter image description here


Если вы застряли на PHP 5, сравните временные метки

return $a['startdate']->getTimestamp() - $b['startdate']->getTimestamp();
...