php自定义数组为季节排序

时间:2012-08-13 21:08:02

标签: php arrays sorting

我有一个数组:

$a = array("Freshman Spring" => 3, "Freshman Winter" => 2, "Freshman Summer" => 4, "Freshman Fall" => 1); 

每个学年都会有不同的数组,但没有数组会混合年份,如fre,soph。

我的问题是,我需要按照学校季节(秋季,冬季,春季,夏季)的方式对这个数组进行排序。我尝试使用uksort,但我的代码实际上没有任何结果,因为无论如何它都以相同的方式排序。

function cmp($a, $b) {
    $a = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $a);
    $b = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $b);
    return strcasecmp($a, $b);
}

uksort($a, "cmp");

我明白了:

Array
(
    [Freshman Fall] => 1
    [Freshman Spring] => 3
    [Freshman Summer] => 4
    [Freshman Winter] => 2
)

但需要得到这个:

Array
(
    [Freshman Fall] => 1
    [Freshman Winter] => 2
    [Freshman Spring] => 3
    [Freshman Summer] => 4
)

uksort是顺便走的吗?我做错了什么?请记住,数组值不是那些值,它们将保存对象。非常感谢任何和所有的帮助!

4 个答案:

答案 0 :(得分:1)

为什么不将值用作键{1,2,3,4}并将“object”存储为值。使排序变得非常简单......

如果你想要漂亮的名字,你总是可以将{1,2,3,4}映射到定义或类别。

答案 1 :(得分:1)

你真的很亲密。实际上,uksort正在完成您要求它做的事情,剥离等级指定,并按字母顺序排序第二个单词。你需要做的是有点不同 - 你要求它按季节排序。根据您想要查看的排序顺序,您将不得不为它们编写自己的比较。您可以使用mr-sk给出的解决方案,或者您可以执行以下操作:

function cmp($a, $b) {
    $a = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $a);
    $b = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $b);
    $seasons = array("FALL"=>0, "WINTER"=>1, "SPRING"=>2, "SUMMER"=>3);
    return $seasons[strtoupper($a)]-$seasons[strtoupper($b)];
}

另外,你可以改变你的正则表达式(如果你确定你只会在开头得到那些单词)

/^\w* /

享受!

答案 2 :(得分:1)

你的代码失败了,因为你只在季节上做了一个strcasecmp() - 换句话说,你是按字母顺序划分季节,这就是你的结果。您需要按照定义的顺序排序。

我会这样做,将季节转换为预先指定的数字:

function cmp($a, $b) {
    $seasons = array('Fall'=>1, 'Winter'=>2, 'Spring'=>3, 'Summer'=>4);
    $aParts = explode(' ', $a);
    $bParts = explode(' ', $b);

    $a = $seasons[$aParts[1]];
    $b = $seasons[$bParts[1]]

    return $b - $a;
}

如果要包含类:

function cmp($a, $b) {
    $classes = array('Freshman'=>1, 'Sophomore'=>2, 'Junior'=>3, 'Senior'=>4);
    $seasons = array('Fall'=>1, 'Winter'=>2, 'Spring'=>3, 'Summer'=>4);
    list($aClass, $aSeason) = explode(' ', $a);
    list($bClass, $bSeason) = explode(' ', $b);
    $aNum = 10*$classes[$aClass] + $seasons[$aSeason];
    $bNum = 10*$classes[$bClass] + $seasons[$bSeason];

    return $bNum - $aNum;           
}

答案 3 :(得分:-1)

您按键排序而不是值。如果你按键排序,你会跌倒<弹簧<夏天<冬季。

只需使用

asort($a);

这将按值(1,2,3,4)排序,但保持关键相关性。