Строка сортировки, которая содержит месяц и год — «май — 2016»

Описание:

У меня есть ассоциативный массив, в котором хранится количество статей для определенного месяца и года. Это выглядит так:

[
'april 2017' => 5,
'may 2017' => 5,
'december 2014' => 5,
'april 2016' => 5,
]

Эта проблема:

Этот массив должен быть отсортирован от самого нового до самого старого. Я не могу придумать способ решить эту проблему сортировки. Я думал об использовании функции разнесения, но тогда значения уже не упорядочены и не имеет смысла. У кого-нибудь еще была эта проблема?

Каков наилучший подход / способ его решения?

2

Решение

Есть несколько решений. Вот только два из них.

Ты можешь использовать 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 если ваши ключи даты недействительны. В этом случае код не потерпит неудачу, но результаты будут непредсказуемыми.

1

Другие решения

Ты можешь использовать strtotime() на вашей дате строки, как 'april 2017' чтобы получить сопоставимые данные.

Если у вас есть это, просто найдите алгоритм сортировки, который соответствует вашим потребностям: https://en.wikipedia.org/wiki/Sorting_algorithm.
Этот выбор будет зависеть от способа хранения данных в вашем массиве.

0

Попробуй это :

$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);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector