2011-05-13 93 views
2

我有一個數值數組這樣訂購陣列日期

04|2012 
05|2011 
05|2011 
06|2011 
08|2011 

其實這些都是日期。問題是我不知道如何訂購它們降序

+0

這是你的數組鍵值? – jimy 2011-05-13 07:20:12

回答

0

如果您只需要使用數組中的這2個項目進行排序,則可以在一維整數數組中將單個項目中的年份和日期連接起來並有類似的東西:

201204 
201105 
201105 
201106 
201108 

並在這種排序後,它像一個ussual一維數組,但降序。

3

假設該格式代表month|year和你運行PHP 5.3+:

usort($array, function ($a, $b) { 
    $toTime = function ($str) { 
     list($month, $year) = explode('|', $str); 
     return mktime(0, 0, 0, $month, 1, $year); 
    } 

    $a = $toTime($a); 
    $b = $toTime($b); 

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

+1正在處理非常類似的事情:) – kapa 2011-05-13 07:23:20

3

如果您使用類似於SQL的日期格式(YYYY-MM-DD),那麼你可以在字符串直接日期排序任何訂單。

如果日期格式不能改變:

<?php 

$a = array(
    '04|2012', 
    '05|2011', 
    '05|2011', 
    '06|2011', 
    '08|2011', 
); 


function compare_strange_dates($date1, $date2) { 
    return strcmp(
     implode('-', array_reverse(explode('|', $date1))), 
     implode('-', array_reverse(explode('|', $date2))) 
    ); 
} 

usort($a, 'compare_strange_dates'); // ascending 
$d = array_reverse($a); // descending 

var_dump($a); 
var_dump($d); 

如果你只想要降序排列,交換$ DATE1和$ DATE2在compare_strange_dates()return語句,只usort使用。

1

隨着$dates是你的陣列,你可以做(​​demo

usort($dates, function($a, $b) { 
    return DateTime::createFromFormat('m\|Y', $b)->format('U') 
     - DateTime::createFromFormat('m\|Y', $a)->format('U'); 
}); 
print_r($dates); 

,這並不需要轉換爲日期,應該是更快的替代,將是(demo

usort($dates, function($a, $b) { 
    return preg_replace('#(\d{2})\|(\d{4})#', '$2$1', $b) 
     - preg_replace('#(\d{2})\|(\d{4})#', '$2$1', $a); 
}); 
print_r($dates); 

兩個輸出

Array 
(
    [0] => 04|2012 
    [1] => 08|2011 
    [2] => 06|2011 
    [3] => 05|2011 
    [4] => 05|2011 
) 

注意:a由於lambda表達式,這些需要PHP 5.3+。