2012-06-26 65 views
0

我相信這已被回答某處之前,但我無法找到這個確切的案例的答案... 我知道我可以使用usort函數,但可以' W圖出來的邏輯做我想要什麼儘管它已經是比較簡單的如何自定義按特定月份排序數組

我有一個充滿活力的領域產生這樣:

$details[$pageYear][$pageMonth][] = array(
    "id" => $page['id'], 
    "title" => $page['title'] 
); 

我想要的陣列$details是最終排序逐年下降,然後通過月

th電子月的價值是字符串(一月,二月,三月,等等,而不是數字),這似乎是我的主要問題(如何按實際順序排序月'串',而不是字母順序)

任何幫助將不勝感激 對不起,如果這原來是一個重複

+0

可以使用的strtotime()的名稱轉換爲數值? –

+1

您的數據是從數據庫中檢索的嗎?如果是這樣,按照您描述的方式排列數據的最簡單方法是在您的SQL查詢中使用ORDER BY修飾符。 – blearn

+0

[array_multisort](http://br.php.net/manual/pt_BR/function.array-multisort.php)可能對您有用。 –

回答

3

你可以使用uasort惠特這個回調?

<?php 
function cmp_month_strings($a_string, $b_string) 
{ 
    $a_value = strtotime("{$a_string} 2000"); 
    $b_value = strtotime("{$b_string} 2000"); 

    if($a_value == $b_value) 
     return 0; 
    else if($a_value < $b_value) 
     return -1; 
    else 
     return 1; 
} 
?> 
+0

我正要提供一些月份的地圖 - 作爲「比較」方法的地圖 - 但您的解決方案更加優雅! (+1) – alfasin

+0

我最終使用了krsort,因爲我已經對所有東西都進行了排序並且需要將它們顛倒過來......不知道爲什麼我之前沒有想到這一點,謝謝大家! –

+0

如果他們alredy排序,我認爲array_reverse()更快 –

0

來者皆排序,你需要uksort 一些類似的方式:

uksort($details, function($a, $b) { 
    return ($a < $b) ? -1 : 1; 
}); 

foreach ($details as &$year) { 
    uksort($year, function($a, $b) { 
     $montha = (int) date('m', strtotime("{$a} 1 2000")); 
     $monthb = (int) date('m', strtotime("{$b} 1 2000")); 
     return ($montha < $monthb) ? -1 : 1; 
    }); 
}