使用php在多维数组中按键排序

使用php在多维数组中按键排序,php,multidimensional-array,sorting,ksort,Php,Multidimensional Array,Sorting,Ksort,可能重复: 如何在多维数组中按键排序 例如,下面是我从数据库打印的数组,其中最新的数组排在第一位-12月、11月、10月等和2011年、2010年、2009年等 Array ( [0] => Array ( [URL] => september 2011 [Title] => September 2011 [Date] => 8 [Month] =&g

可能重复:

如何在多维数组中按键排序

例如,下面是我从数据库打印的数组,其中最新的数组排在第一位-12月、11月、10月等2011年、2010年、2009年等

Array
(
    [0] => Array
        (
            [URL] => september 2011
            [Title] => September 2011
            [Date] => 8
            [Month] => 9
            [Year] => 2011
        )

    [1] => Array
        (
            [URL] => january 2011
            [Title] => January 2011
            [Date] => 1
            [Month] => 2
            [Year] => 2011
        )

    [2] => Array
        (
            [URL] => february 2011
            [Title] => February 2011
            [Date] => 4
            [Month] => 1
            [Year] => 2011
        )

    [3] => Array
        (
            [URL] => november 2011
            [Title] => November 2011
            [Date] => 23
            [Month] => 11
            [Year] => 2010
        )

    [4] => Array
        (
            [URL] => april 2011
            [Title] => April 2011
            [Date] => 23
            [Month] => 4
            [Year] => 2010
        )

)
但我需要这样,10月、11月、12月等2011年、2010年、2009年等-注意月份是按最老的排在第一位,但年份仍然是按最新的排在第一位

所以数组应该像这样排序

Array
(

    [2] => Array
        (
            [URL] => february 2011
            [Title] => February 2011
            [Date] => 4
            [Month] => 1
            [Year] => 2011
        )

    [1] => Array
        (
            [URL] => january 2011
            [Title] => January 2011
            [Date] => 1
            [Month] => 2
            [Year] => 2011
        )

    [0] => Array
        (
            [URL] => september 2011
            [Title] => September 2011
            [Date] => 8
            [Month] => 9
            [Year] => 2011
        )

    [4] => Array
        (
            [URL] => april 2010
            [Title] => April 2010
            [Date] => 23
            [Month] => 4
            [Year] => 2010
        )

    [3] => Array
        (
            [URL] => november 2010
            [Title] => November 2010
            [Date] => 23
            [Month] => 11
            [Year] => 2010
        )
)
这可能吗?

对具有多个键的数组进行排序的通用解决方案 根据我对的回答,这里有一个非常通用的解决方案,可以在很多情况下使用

限制:由于存在匿名函数,需要PHP>=5.3才能工作

新的和改进的,现在支持降序排序 要按年份升序排序,然后按月份升序排序:

uasort($array, make_comparer('Year'));
uasort($array, make_comparer('Year', 'Month'));
uasort($array, make_comparer(array('Year', SORT_DESC), 'Month'));
要按年份降序排序,然后按月份升序排序,请执行以下操作:

uasort($array, make_comparer('Year'));
uasort($array, make_comparer('Year', 'Month'));
uasort($array, make_comparer(array('Year', SORT_DESC), 'Month'));

最后一个是您要找的。

假设您在问题中提供的数据实际上是正确的(以年、月、日为基础创建排序),您可以首先根据这些值对数组进行索引,然后对主数组进行排序。我只是在写,否则您可能会误读的输出,URL/标题与给定的数值不对应,但它只是工作:

// create an index by date
foreach($data as $k=>$v)
{
    $index[$k] = sprintf('%04d-%02d-%02d', $v['Year'], $v['Month'], $v['Date']);
}

// sort data based on the index
array_multisort($index, SORT_DESC, $data);
那么:

数据:

代码:

输出:

Array
(
[0] => Array
    (
        [URL] => february 2011
        [Title] => February 2011
        [Date] => 4
        [Month] => 1
        [Year] => 2011
    )

[1] => Array
    (
        [URL] => january 2011
        [Title] => January 2011
        [Date] => 1
        [Month] => 2
        [Year] => 2011
    )

[2] => Array
    (
        [URL] => september 2011
        [Title] => September 2011
        [Date] => 8
        [Month] => 9
        [Year] => 2011
    )

[3] => Array
    (
        [URL] => april 2011
        [Title] => April 2011
        [Date] => 23
        [Month] => 4
        [Year] => 2010
    )

[4] => Array
    (
        [URL] => november 2011
        [Title] => November 2011
        [Date] => 23
        [Month] => 11
        [Year] => 2010
    )

)

非常感谢。它工作得很好@劳蒂亚姆科克:不客气,我希望你能找到它的许多用途。我会的!谢谢你的帮助!:)+1比我的更通用的解决方案。是的,那也很好!谢谢:)