У меня есть массив в этом формате:
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()
и снова array_sort()
их, чтобы отсортировать их? Предпочитаю, если бы был другой способ, поскольку я бы делал 3 цикла с этим для каждого пользователя.
Благодарю.
Изменить: я мог бы также сделать это:
$array[$index]=array('human'=>'28 Feb, 2009', 'db'=>'20080228', 'description'=>'Some text here');
Но используя это, можно ли каким-либо образом отсортировать массив на основе элемента 'db'?
Изменить 2: Обновлен начальный файл var_dump
Используйте формат ISO ( yyyy-mm-dd
), а не формат «english», а затем просто используйте функцию ksort
чтобы получить их в правильном порядке.
Нет необходимости удалять дефисы, ksort
будет выполнять буквенно-цифровое сравнение строковых ключей, а формат yyyy-mm-dd
отлично работает, поскольку лексический порядок совпадает с фактическим порядком даты.
EDIT. Я вижу, что теперь вы исправили свой вопрос, чтобы показать, что на самом деле у вас массив массивов, и что ключ сортировки находится в поддиапазонах. В этом случае вы должны использовать uksort
как рекомендовано в других местах, но я бы рекомендовал вам перейти со своим собственным редактированием и сортировкой на основе даты форматирования в БД, а не путем разбора понятного для человека формата:
function cmp($a, $b) { global $array; return strcmp($array[$a]['db'], $array[$b]['db']); } uksort($array, 'cmp');
Собственно, используйте это:
usort($array, "cmp"); function cmp($a, $b){ return strcmp($b['db'], $a['db']); }
🙂
function cmp($a, $b) { global $array; return strcmp($array[$a]['db'], $array[$b]['db']); } uksort($array, 'cmp');
Я думаю, что лучше использовать usort()
вместо uksort()
, потому что иногда вы не можете использовать глобальные переменные вообще и, в любом случае, используя глобальные переменные, тоже не является хорошей практикой.
Вы также можете использовать анонимную функцию.
// Sort in chronological order. usort($array, function($a, $b) { return strcmp($a['db'], $b['db']); });