Подтвердить что ты не робот

PHP порядок массива по дате?

Возможный дубликат:
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"
}

Что я хочу сделать, это упорядочить два элемента по дате.

  • Можно ли сортировать по дате, когда значение сортировки находится внутри каждого элемента?
  • Нужно ли преобразовать формат даты в метку времени?

Что я не хочу делать

Я мог бы использовать дату и установить ее как идентификатор, но это не так, потому что два элемента могут иметь одну и ту же дату, а затем они не будут уникальными.

4b9b3361

Ответ 1

Вам не нужно преобразовывать свои даты в 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);

Ответ 2

Используйте usort:

usort($array, function($a1, $a2) {
   $v1 = strtotime($a1['date']);
   $v2 = strtotime($a2['date']);
   return $v1 - $v2; // $v2 - $v1 to reverse direction
});

Ответ 3

Я рекомендую использовать объекты DateTime вместо строк, потому что вы не можете легко сравнивать строки, необходимые для сортировки. Вы также получаете дополнительные преимущества для работы с датами.

Как только у вас есть объекты DateTime, сортировка довольно проста:

usort($array, function($a, $b) {
  return ($a['date'] < $b['date']) ? -1 : 1;
});

Ответ 4

Он рассматривал дату как ключ, но беспокоился о том, что ценности будут написаны один над другим, все, что я хотел показать (может быть, не так очевидно, почему я редактирую) заключается в том, что он все еще может иметь ценности, не написано над другим, разве это не нормально?!

<?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);
?>