У меня есть двумерный массив в этой форме:
$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), и он работает именно так, как я ожидаю. Еще раз спасибо всем, кто внес свой вклад.
Ваши строки даты должны быть в формате year/month/day
, чтобы это сравнение по алфавиту работало правильно.
10 это месяц или день?
Вы можете изменить структуру массива. $my_array = массив («дата» => массив («04.10.2019», «05.10.2017»));
@Jonnix Я думал об этом раньше, но по какой-то причине не стал этого делать. Это имеет смысл.
@RahulMeshram 10 будет днем.
Как вы сказали, у вас есть формат 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.
Источник связь.
Демо.
Функция сравнения должна возвращать число, а не логическое значение.
Я внес изменения. Пожалуйста, посмотрите.
Он говорит в комментарии, что даты в формате dd/mm/yyyy
. strtotime()
будет анализировать их как mm/dd/yyyy
.
Я заменил /
на -
. Вы можете обновить страницу для отраженных изменений.
Комбинация информации, которую я узнал из этого комментария, и некоторых из приведенных ниже комментариев, предполагающих, что я сравниваю строки, а не дату (за которую я проголосовал), дала мне окончательный ответ. Поэтому я отмечаю этот ответ как правильный для источника, цитаты, демонстрации и краткого ответа. Спасибо всем.
для вас было бы лучше сравнивать метки времени, а не строки даты
$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);
У меня нет доступа к оператору космического корабля.
Измените формат даты следующим образом: 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);
Если вы измените формат даты на ГГГГ/ММ/ДД, ваша функция должна начать работать правильно.
Вы сравниваете строки, а не даты.
4
перед5
.