Как отсортировать массив дат в PHP

У меня есть массив в таком формате:

Array
(
    [0] => Array
        (
            [28th February, 2009] => 'bla'
        )

    [1] => Array
        (
            [19th March, 2009] => 'bla'
        )

    [2] => Array
        (
            [5th April, 2009] => 'bla'
        )

    [3] => Array
        (
            [19th April, 2009] => 'bla'
        )

    [4] => Array
        (
            [2nd May, 2009] => 'bla'
        )

) 

Я хочу отсортировать их в порядке возрастания дат (на основе месяца, дня и года). Как лучше всего это сделать?

Первоначально электронные письма извлекаются в формате даты MySQL, поэтому я могу получить массив в этом состоянии:

Array
[
    ['2008-02-28']='some text',
    ['2008-03-06']='some text'
]

Возможно, когда он в этом формате, я могу перебрать их, удалить все метки '-' (дефис), чтобы они остались как целые числа, отсортировать их, используя array_sort(), и еще раз перебрать их, чтобы отсортировать? Я бы предпочел, чтобы был другой способ, так как я бы выполнял 3 цикла для каждого пользователя.

Спасибо.

Изменить: я также мог бы сделать это:

$array[$index]=array('human'=>'28 Feb, 2009',
                   'db'=>'20080228',
                   'description'=>'Some text here');

Но, используя это, будет ли какой-либо способ отсортировать массив только на основе элемента «db»?

Редактировать 2: обновлен начальный var_dump


person Ali    schedule 28.02.2009    source источник
comment
Не могли бы вы использовать var_dump() для своих данных вместо того, чтобы создавать свой собственный формат? По крайней мере, когда ваш собственный формат столь же неоднозначен и вводит в заблуждение, как то, что вы разместили здесь. ;-)   -  person Tomalak    schedule 28.02.2009


Ответы (4)


Используйте формат ISO (yyyy-mm-dd), а не «английский» формат, а затем просто используйте ksort, чтобы получить их в правильном порядке.

Нет необходимости удалять дефисы, ksort будет выполнять буквенно-цифровое сравнение строковых ключей, а формат yyyy-mm-dd отлично работает, поскольку лексический порядок совпадает с фактическим порядком даты.

EDIT Я вижу, что вы исправили свой вопрос, чтобы показать, что у вас действительно есть массив массивов и что ключ сортировки находится в подмассивах. В этом случае вы должны использовать uksort, как рекомендовано в другом месте, но я бы рекомендовал вам использовать собственное редактирование и сортировку на основе даты в формате БД, а не путем анализа удобочитаемого формата:

function cmp($a, $b)
{
    global $array;
    return strcmp($array[$a]['db'], $array[$b]['db']);
}

uksort($array, 'cmp');
person Alnitak    schedule 28.02.2009
comment
Спасибо за это. Какую функцию я бы использовал, если бы это была (не вложенная) обычная indexed array, а не associative array? ksort, похоже, работает только с ассоциативными массивами AFAIK - person Kyle Vassella; 15.04.2021

Собственно, используйте это:

usort($array, "cmp");

function cmp($a, $b){ 
    return strcmp($b['db'], $a['db']); 
}

:)

person trend    schedule 23.12.2010

function cmp($a, $b) {    
    global $array;    
    return strcmp($array[$a]['db'], $array[$b]['db']); 
}    
uksort($array, 'cmp');

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

person Alexander    schedule 08.06.2010

Вы также можете использовать анонимную функцию.

// Sort in chronological order.
usort($array, function($a, $b) {
  return strcmp($a['db'], $b['db']);
});
person Rafal Enden    schedule 08.02.2016
comment
Этот ответ в основном такой же, как и старые ответы - person Machavity♦; 08.02.2016
comment
Он использует анонимную функцию там, где другие этого не делают. - person Rafal Enden; 09.02.2016