2012-06-26 39 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; 
    }); 
}