我有一个数组:
$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是顺便走的吗?我做错了什么?请记住,数组值不是那些值,它们将保存对象。非常感谢任何和所有的帮助!
答案 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)排序,但保持关键相关性。