Как сортировать двумерные массивы по ключу в PHP

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

$my_array = array(
    array("date" => "10/04/2019"),
    array("date" => "10/05/2017")
    ...
)

Все, что я пытаюсь сделать, это отсортировать его так, чтобы массив с датой 10/05/2017 стоял перед другими.

Я пробовал следующее:

usort(
    $my_array,
    function($a, $b) {
        return strcmp($a['date'], $b['date']);
    }
    );

Кажется, это не работает.

Я до сих пор получаю, что более поздние даты ставятся перед более ранними.

Это немного сложнее, чем то, что я продемонстрировал, но я думаю, что это основной принцип. Если в примере, который я привел, что-то не так, то это само по себе может многое объяснить.

Редактировать - Исправлено по правильному ответу и другим комментариям. Я сравнивал строки, а не даты. Обертка strtotime сделала так, что сравнение идет между датами. Я также изменил формат дат на Y/m/d (формат MySQL), и он работает именно так, как я ожидаю. Еще раз спасибо всем, кто внес свой вклад.

Вы сравниваете строки, а не даты. 4 перед 5.

Jonnix 10.04.2019 11:10

Ваши строки даты должны быть в формате year/month/day, чтобы это сравнение по алфавиту работало правильно.

Kaddath 10.04.2019 11:11

10 это месяц или день?

Rahul 10.04.2019 11:11

Вы можете изменить структуру массива. $my_array = массив («дата» => массив («04.10.2019», «05.10.2017»));

Shehroz Altaf 10.04.2019 11:21

@Jonnix Я думал об этом раньше, но по какой-то причине не стал этого делать. Это имеет смысл.

Beederab 10.04.2019 11:29

@RahulMeshram 10 будет днем.

Beederab 10.04.2019 11:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
84
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Как вы сказали, у вас есть формат d/m/Y, который недействителен в соответствии с документацией PHP, вам нужно преобразовать его в d-m-Y.
Вы можете сравнить даты, как показано ниже,

usort($my_array, function ($a, $b) {
    $aDate = strtotime(str_replace("/", "-", $a['date']));
    $bDate = strtotime(str_replace("/", "-", $b['date']));
    return $aDate - $bDate;
});

Note: Dates in the m/d/y or d-m-y formats are disambiguated by lookingat the separator between the various components: if the separator is aslash (/), then the American m/d/y is assumed; whereas if theseparator is a dash (-) or a dot (.), then the European d-m-y formatis assumed. If, however, the year is given in a two digit format andthe separator is a dash (-, the date string is parsed as y-m-d.

Источник связь.

Демо.

Функция сравнения должна возвращать число, а не логическое значение.

Barmar 10.04.2019 11:20

Я внес изменения. Пожалуйста, посмотрите.

Rahul 10.04.2019 11:26

Он говорит в комментарии, что даты в формате dd/mm/yyyy. strtotime() будет анализировать их как mm/dd/yyyy.

Barmar 10.04.2019 11:30

Я заменил / на -. Вы можете обновить страницу для отраженных изменений.

Rahul 10.04.2019 11:35

Комбинация информации, которую я узнал из этого комментария, и некоторых из приведенных ниже комментариев, предполагающих, что я сравниваю строки, а не дату (за которую я проголосовал), дала мне окончательный ответ. Поэтому я отмечаю этот ответ как правильный для источника, цитаты, демонстрации и краткого ответа. Спасибо всем.

Beederab 10.04.2019 11:40

для вас было бы лучше сравнивать метки времени, а не строки даты

$my_array = array(
    array("date" => "10/04/2019"),
    array("date" => "10/05/2017")
);

usort($my_array, function ($a, $b) {
    return strtotime($a['date']) <=> strtotime($b['date']);
});

print_r($my_array);

демо https://3v4l.org/KGAIk

У меня нет доступа к оператору космического корабля.

Beederab 10.04.2019 11:34

Измените формат даты следующим образом: d-m-Y. После преобразования вашей даты ваша функция будет работать нормально.

См. ниже рабочий код

    $my_array = array(
    array("date" => "11-04-2019"),
    array("date" => "12-05-2017"),
    array("date" => "13-05-2018"),
    array("date" => "14-05-2016"));
usort(
    $my_array,
    function ($a, $b) {
        return strtotime($a['date']) - strtotime($b['date']);
    });
print_r($my_array);

Если вы измените формат даты на ГГГГ/ММ/ДД, ваша функция должна начать работать правильно.

Другие вопросы по теме