2014-03-04 252 views
2

我試過使用usort但我有問題PHP按日期排序

我現在已經使用了usort函數。

我的數組是有一個字符串鍵,它代表了日

我的輸出如下字符串值:

02/09/2013 
03/09/2013 
03/10/2013 
04/07/2013 
04/09/2013 
09/09/2013 
11/09/2013 
13/06/2013 
13/08/2013 

它僅由前兩個數字排序,我希望它排序完整的日期,我做錯了什麼?

這是我的代碼:

usort($filesWithDates,"my_sort"); 
foreach ($filesWithDates as &$value) { 
    echo $value."<br/>"; 
} 

function my_sort($a,$b) 
{ 
if ($a==$b) return 0; 
return ($a<$b)?-1:1; 
} 
foreach ($filesWithDates as &$value) { 
     echo $value."<br/>"; 
    } 
+0

你能避免很多問題,如果您使用ISO格式的日期(YYYY-mm-dd)或簡單的unix時間戳。除此之外,您必須在比較函數中解析/分解$ a和$ b,而不僅僅是比較字符串。 – ToBe

回答

4

這些都不是日期。這些是字符串。你需要把你的日期,要麼是排序爲字符串正確格式或比較它們的日期使用DateTime()

usort($filesWithDates, function($a, $b) { 
    $date1 = DateTime::createFromFormat('d/m/Y', $a); 
    $date2 = DateTime::createFromFormat('d/m/Y', $b); 
    return $date1 > $date2; 
}); 
foreach ($filesWithDates as $value) { 
    echo $value."<br/>"; 
} 
+0

不知道usort以'callable'作爲參數。太好了! – ex3v

+0

謝謝你的完美。 – Joe

+0

我有一個問題,在我調用這個函數之前,我的鍵值是一個字符串,在執行這個函數後,我的數組鍵被改爲'0,1,2,3,4 ....'等。爲什麼它會覆蓋我的密鑰嗎? – Joe

0

您的日期轉換爲整數第一:

$datesAsInts = array(); 
foreach($filesWithDats as $value) { 
    $datesAsInts[] = strtotime($value); 
} 
usort($datesAsInts,"my_sort"); 
foreach ($datesAsInts as $value) { 
    echo date('d/m/Y', $value)."<br/>"; 
} 

function my_sort($a,$b) 
{ 
    if ($a==$b) return 0; 
    return ($a<$b)?-1:1; 
} 
+0

這還是不能解析日期並對它們進行正確分類 – ToBe

+0

@ToBe如何給別人時間寫出他們的答案......當你投票時,它是他的代碼的精確副本。 – Styphon

+0

好的,授予。但爲什麼發佈答案,如果它沒有完成?無論如何。不是討論這個問題的地方。當答案改變時,我會刪除我的downvote。 (下移) – ToBe