2012-08-15 33 views
0

我知道这个问题已经被问了好几次了,但是给出的答案并没有帮助我的情况。如何按键排序php中的多维数组?

我有一个简单的数组,基本上代表了月份和年份。该数组的唯一目的是跟踪数据库中的事件,并且我需要知道表示哪个月份和哪些年份。该阵列基本上是:

$array[MONTH][YEAR] = 1; //just any value. Don't care about the value. 

我需要对数组进行排序,以便年份是有序的,但同一年的任何月份也应该排序。见我下面要输出...

$dates[10][2012] = 1; 
$dates[1][2011] = 1; 
$dates[12][2013] = 1; 
$dates[4][2010] = 1; 
$dates[6][2009] = 1; 
$dates[7][2009] = 1; 

,这样的价值观回来为我如何排序这个数组:

Array 
(
    [6] => Array 
    (
     [2009] => 1 
    ) 
    [7] => Array 
    (
     [2009] => 1 
    ) 
    [4] => Array 
    (
     [2010] => 1 
    ) 
    [1] => Array 
    (
     [2011] => 1 
    ) 
    [10] => Array 
    (
     [2012] => 1 
    ) 
    [12] => Array 
    (
     [2013] => 1 
    ) 
} 

提前感谢!

+0

无论哪种方式,我该怎么办按年份排序,然后是月份? – pogeybait 2012-08-15 03:40:56

+0

我已在下面更新了我的答案,以显示如果您更改索引顺序如何对其进行排序。我认为你已经被锁定到了这个顺序,但是如果你可以将它改为'[YEAR] [MONTH]',那么它确实简单得多。 – DaoWen 2012-08-15 07:19:35

回答

5

尝试使用uasort。你可以编写一个自定义函数来排序内部键而不是外部键。

编辑:

事实证明,你需要使用uksort,如果你想外月份以及排序。这似乎工作:

uksort($dates, function ($a, $b) use ($dates) { 
    $year = key($dates[$a]) - key($dates[$b]); 
    $month = $a - $b; 
    return $year == 0 ? $month : $year; 
}); 

编辑:

如果你只是更改索引顺序一样乔恩建议以上是简单得多:

$dates[2012][10] = 1; 
$dates[2011][1] = 1; 
$dates[2013][12] = 1; 
$dates[2010][4] = 1; 
$dates[2009][7] = 1; 
$dates[2009][6] = 1; 

ksort($dates); 
array_walk($dates, ksort); 

print_r($dates); 
+0

这实际上是'uksort'通过键排序 – Hameed 2012-08-15 03:30:59

+0

如果我能弄清楚如何在这个问题上使用这些排序功能,我会做出来的。有一个你正在谈论哈米德的例子吗? – pogeybait 2012-08-15 03:42:02

+0

@Hameed - 我在想,我们只需要对内部数组上的键进行排序,并可以忽略外部键。我编辑了我的答案,并用'uksort'代替了一个例子。 – DaoWen 2012-08-15 03:45:14