如何在php中按键对多维数组进行排序?

如何在php中按键对多维数组进行排序?,php,Php,我知道这个问题已经被问过好几次了,但给出的答案对我的情况没有帮助 我有一个简单的数组,基本上表示月份和年份。数组的唯一用途是跟踪数据库中的事件,我需要知道表示的月份和年份。阵列基本上是: $array[MONTH][YEAR] = 1; //just any value. Don't care about the value. 我需要对数组进行排序,以便年份是有序的,但同一年中的任何月份也应该进行排序。请参阅下面我想要的输出 $dates[10][2012] = 1; $dates[1][20

我知道这个问题已经被问过好几次了,但给出的答案对我的情况没有帮助

我有一个简单的数组,基本上表示月份和年份。数组的唯一用途是跟踪数据库中的事件,我需要知道表示的月份和年份。阵列基本上是:

$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
    )
}
提前谢谢

尝试使用。您可以编写自定义函数,根据内部键而不是外部键进行排序

编辑:

事实证明,如果还想对外部月份进行排序,则需要使用。这似乎有效:

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

如果您只是像上面Jon建议的那样更改索引顺序,则会简单得多:

$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);
尝试使用。您可以编写自定义函数,根据内部键而不是外部键进行排序

编辑:

事实证明,如果还想对外部月份进行排序,则需要使用。这似乎有效:

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

如果您只是像上面Jon建议的那样更改索引顺序,则会简单得多:

$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);

这实际上是按键排序的
uksort
,如果我能想出如何在这个问题上使用这些排序函数,我会让它。有没有关于你所说的Hameed的例子?@Hameed-我想我们只需要对内部数组上的键进行排序,就可以忽略外部数组。我编辑了我的答案,并用
uksort
添加了一个示例。非常接近。月份不正常;以下是我得到的:$dates[2012][9]=1$日期[2012][8]=1;//运行你的例行数组([2012]=>Array([9]=>1[8]=>1))@pogeybait-你完全正确。我不知道输入中的月份已经安排好了。显然,
array\u map
没有像我想象的那样做。我把它换成了
array\u walk
,现在它可以像你期望的那样工作了。这实际上就是
uksort
按键排序如果我能弄清楚如何在这个问题上使用这些排序函数,我会把它制作出来。有没有关于你所说的Hameed的例子?@Hameed-我想我们只需要对内部数组上的键进行排序,就可以忽略外部数组。我编辑了我的答案,并用
uksort
添加了一个示例。非常接近。月份不正常;以下是我得到的:$dates[2012][9]=1$日期[2012][8]=1;//运行你的例行数组([2012]=>Array([9]=>1[8]=>1))@pogeybait-你完全正确。我不知道输入中的月份已经安排好了。显然,
array\u map
没有像我想象的那样做。我把它换成了
array\u walk
,现在它可以像你期望的那样工作了。不管是哪种方式,我该如何按年排序,然后按月排序?我已经更新了下面的答案,以显示如果你更改索引顺序,你会如何排序。我假设您被锁定在该顺序中,但如果您可以将其改为
[年][月]
,则实际上要简单得多。无论哪种方式,我如何按年排序,然后按月排序?我已更新了下面的答案,以显示如果您更改索引顺序,您将如何排序。我假设您被锁定在该顺序中,但如果您可以将其改为
[年][月]
,则实际上要简单得多。