2011-06-19 101 views
21

可能重复:
PHP Sort a multidimensional array by element containing date按日期排序PHP数组?

我从一个PHP数组XML或JSON的一些数据,看起来像这样:

[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" 
} 

我想要做什么是按日期排列这两个项目。

  1. 是否有可能按日期排序,何时排序值在每个项目内?
  2. 我是否需要将日期格式转换为时间戳?

我不想做

我可以使用日期,并将其设置为ID,但不觉得不对劲,因为两个项目可以有相同的日期,然后它会不是唯一的。

+0

参加这个帖子看看第一个答案:[链接](http://stackoverflow.com/questions/597863/how-to-sort-a-date-array-in-php) – Sander

回答

65

你不需要排序前将日期转换为时间戳,但它是一个好主意,但因为这将需要更多的时间来排序没有它。

$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); 
+0

非常直接的,干净的答案。谢谢。 – Kray

+0

干净的答案,但如果两个日期相等,这将失去价值 –

+0

这是不正确的,为什么呢?他们会一个接一个。 –

26

使用usort

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

这个版本呢? 'usort($ sortArray,函数($一个,$ B){ 返回的strcmp($一个[ 'article_created_date'],$ B [ 'article_created_date']); });' – DrMed

16

我推荐使用DateTime对象而不是字符串,因为您无法轻松比较字符串,这是排序所需的。使用日期还可以获得更多优势。

一旦你的datetime对象,分类是很容易的:

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

他正在考虑具有日期作为重点,但担心值将写入一个上述以外,所有我想证明(也许不那么明显,那为什么我编辑)是他仍然可以保持完整的值,而不是写在上面,这不是好吗?!

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