Возможный дубликат:
PHP Сортировка многомерного массива по элементу, содержащему дату
У меня есть некоторые данные из XML или JSON в массиве PHP, который выглядит так:
[0]= array(2) { ["title"]= string(38) "Another title" ["date"]= string(31) "Fri, 17 Jun 2011 08:55:57 +0200" } [1]= array(2) { ["title"]= string(38) "My title" ["date"]= string(31) "Mon, 16 Jun 2010 06:55:57 +0200" }
То, что я хочу сделать, это заказать два элемента по дате.
Что я не хочу делать
Я мог бы использовать дату и установить ее как идентификатор, но это не так, потому что два элемента могут иметь одну и ту же дату, а затем они не будут уникальными.
Вам не нужно преобразовывать свои даты в timestamp перед сортировкой, но это хорошая идея, хотя для этого потребуется больше времени, чтобы сортировать без нее.
$data = array( array( "title" => "Another title", "date" => "Fri, 17 Jun 2011 08:55:57 +0200" ), array( "title" => "My title", "date" => "Mon, 16 Jun 2010 06:55:57 +0200" ) ); function sortFunction( $a, $b ) { return strtotime($a["date"]) - strtotime($b["date"]); } usort($data, "sortFunction"); var_dump($data);
Использовать usort :
usort($array, function($a1, $a2) { $v1 = strtotime($a1['date']); $v2 = strtotime($a2['date']); return $v1 - $v2; // $v2 - $v1 to reverse direction });
Я рекомендую использовать объекты DateTime вместо строк, потому что вы не можете легко сравнивать строки, необходимые для сортировки. Вы также получаете дополнительные преимущества для работы с датами.
Когда у вас есть объекты DateTime, сортировка довольно проста:
usort($array, function($a, $b) { return ($a['date'] < $b['date']) ? -1 : 1; });
Он рассматривал дату как ключ, но беспокоился о том, что ценности будут записаны один над другим, все, что я хотел показать (может быть, не так очевидно, почему я редактирую), так это то, что он все еще может иметь ценности, а не написанные выше других, разве это не нормально?
<?php $data['may_1_2002']= Array( 'title_id_32'=>'Good morning', 'title_id_21'=>'Blue sky', 'title_id_3'=>'Summer', 'date'=>'1 May 2002' ); $data['may_2_2002']= Array( 'title_id_34'=>'Leaves', 'title_id_20'=>'Old times', 'date'=>'2 May 2002 ' ); echo '<pre>'; print_r($data); ?>