Описание:
У меня есть ассоциативный массив, в котором хранится количество статей для определенного месяца и года. Это выглядит так:
[
'april 2017' => 5,
'may 2017' => 5,
'december 2014' => 5,
'april 2016' => 5,
]
Эта проблема:
Этот массив должен быть отсортирован от самого нового до самого старого. Я не могу придумать способ решить эту проблему сортировки. Я думал об использовании функции разнесения, но тогда значения уже не упорядочены и не имеет смысла. У кого-нибудь еще была эта проблема?
Каков наилучший подход / способ его решения?
Есть несколько решений. Вот только два из них.
Ты можешь использовать uksort
функция:
uksort($array, function ($a, $b) {
return strtotime($a) - strtotime($b);
});
Или вы можете использовать array_multisort
функция:
array_multisort(array_map('strtotime', array_keys($array)), $array);
Они оба используют strtotime
преобразовать строковое представление даты в метку времени, а затем сравнить метки времени.
Вот рабочая демо.
Обращать внимание к тому факту, что это только показывает концепцию. Это означает, что этот код не будет ловить ошибки синтаксического анализа и strtotime
может вернуться false
если ваши ключи даты недействительны. В этом случае код не потерпит неудачу, но результаты будут непредсказуемыми.
Ты можешь использовать strtotime()
на вашей дате строки, как 'april 2017'
чтобы получить сопоставимые данные.
Если у вас есть это, просто найдите алгоритм сортировки, который соответствует вашим потребностям: https://en.wikipedia.org/wiki/Sorting_algorithm.
Этот выбор будет зависеть от способа хранения данных в вашем массиве.
Попробуй это :
$array = [
'april 2017' => 5,
'may 2017' => 6,
'december 2014' => 3,
'april 2016' => 4,
];
function order_date($a1,$b1) {
$format = 'M Y';
$a = strtotime(date_format(DateTime::createFromFormat($format, $a1), 'Y-m-d H:i:s'));
$b = strtotime(date_format(DateTime::createFromFormat($format, $b1), 'Y-m-d H:i:s'));
if ($a == $b)
{
return 0;
}
else if ($a > $b)
{
return 1;
}
else {
return -1;
}
}
uksort($array, "order_date");
print_r($array);