数组中的多个排序


Multiple sorts in an array

我有以下数组:

Array
(
[0] => Array
    (
        [note] => test
        [year] => 2011
        [type] => football
    )
[1] => Array
    (
        [note] => test1
        [year] => 2010
        [type] => basket
    )
[2] => Array
    (
        [note] => test2
        [year] => 2012
        [type] => football
    )
[3] => Array
    (
        [note] => test3
        [year] => 2009
        [type] => basket
    )
[4] => Array
    (
        [note] => test4
        [year] => 2010
        [type] => football
    )
)

我想首先根据另一个数组按类型进行排序:

例如:$sort = array('football','basket');

然后逐年递增。

我该怎么做?

谢谢。

所需输出应为:

Array
(
[2] => Array
    (
        [note] => test2
        [year] => 2012
        [type] => football
    )
[0] => Array
    (
        [note] => test
        [year] => 2011
        [type] => football
    )
[4] => Array
    (
        [note] => test4
        [year] => 2010
        [type] => football
    )
[1] => Array
    (
        [note] => test1
        [year] => 2010
        [type] => basket
    )
[3] => Array
    (
        [note] => test3
        [year] => 2009
        [type] => basket
    )
)

我不介意我们重新设置索引值。

谢谢。

需要一个在按运行时支持闭包的PHP版本

辅助数组可以在排序本身之外定义。如果不能支持闭包,那么可以直接将其放入排序例程中。

$sortBy = array('football', 'basket');

排序例程。

如果类型相同,则按年份排序,否则按$sortBy数组中的类型排序。

usort($a, function($a, $b) use ($sortBy) {
    if ($a['type'] == $b['type']) {
        return ($b['year'] - $a['year']);
    }
    $typeOrder = array_flip($sortBy);
    return $typeOrder[$a['type']] - $typeOrder[$b['type']];
});

使用array_multisort。假设你的数组是$arr:

foreach($arr as $key=>$row) {
    $type[$key] = $row['type'];
    $year[$key] = $row['year'];
}
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr);

要使用指定类型顺序的附加数组,可以执行以下操作:

$sortBy = array('football','basket');
foreach($arr as $key=>$row) {
    $type[$key] = array_search($row['type'],$sortBy);
    $year[$key] = $row['year'];
}
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr);

示例链接:

http://codepad.org/qhZCpbZE

使用usort

function byType($a, $b)
{
    if ($a['type'] == $b['type']) {
        return 0;
    }
    foreach(array('football','basket') as $type) {
        if ($a['type']=$type) return -1;
        if ($b['type']=$type) return 1;
    }
    return 0;
}

function byYear($a, $b)
{
    if ($a['year'] == $b['year']) {
        return 0;
    }
    return ($a['year'] < $b['year']) ? -1 : 1;
}
usort($array,"byType");
usort($array,"byYear");