我有主要的usort()问题! :(所以基本上我想按照他们的值对数组进行排序。我希望按以下顺序显示数值:白金,金,银,铜,完整,无,不完整。现在我可以对它们进行排序,但我想保留他们的密钥(可能吗?)。这是我的代码:
function compareMedals( $a, $b ) {
$aMap = array(1 => 'Platinum', 2 => 'Gold', 3 => 'Silver', 4 => 'Bronze', 5 => 'Complete', 6 => 'None', 7 => 'Uncomplete');
$aValues = array( 1, 2, 3, 4, 5, 6, 7);
$a = str_ireplace($aMap, $aValues, $a);
$b = str_ireplace($aMap, $aValues, $b);
return $a - $b;
}
usort($list, 'compareMedals');
那么可以在保存密钥的同时对它们进行排序吗?谢谢! :)
修改
阵列:
$array = array("post1" => 'Platinum', "Post2" => "Bronze, "Post3" = > Gold)
应输出:
"Post1" => 'Platinum',
"Post3" => 'Gold',
"Post2" => 'Bronze'
然而它输出了这个:
"0" => 'Platinum',
"1" => 'Gold',
"2" => 'Bronze'
答案 0 :(得分:6)
只需使用uasort
的{{1}} intead。 usort
的定义是
使用用户定义的比较函数对数组进行排序并进行维护 指数协会。
您的比较功能和uasort有一个代码示例:
uasort
该代码给出了结果
$list = array('post1' => 'Gold', 'post2' => 'None', 'post3' => 'Platinum');
function compareMedals( $a, $b ) {
$aMap = array(1 => 'Platinum', 2 => 'Gold', 3 => 'Silver', 4 => 'Bronze', 5 => 'Complete', 6 => 'None', 7 => 'Uncomplete');
$aValues = array( 1, 2, 3, 4, 5, 6, 7);
$a = str_ireplace($aMap, $aValues, $a);
$b = str_ireplace($aMap, $aValues, $b);
return $a - $b;
}
uasort($list, 'compareMedals');
print_r($list);
答案 1 :(得分:1)
usort
没有保留密钥,如果要在排序后保留密钥,则应使用asort
。希望这能帮助你。
答案 2 :(得分:0)
考虑以下假设:
Gold
可能是多个帖子的值)。您可以通过将“映射数组”(aka查找数组)作为关联数组(以“状态”作为键,而“排序值”作为值)进行关联来简化自定义排序功能。我在下面使用array_flip()
,但您可以根据需要写出一维关联数组。
在调用uasort()
来调用自定义排序函数并保留输入数组的键时,请使用use()
在函数范围内传递查找数组。
在php7中,您可以使用“宇宙飞船运算符”(又名三向比较运算符)来巧妙地进行比较。
干净,简短和高效。
代码:(Demo)
$array = ["Post1" => "Platinum", "Post2" => "Bronze", "Post3" => "Gold", "Post4" => "Uncomplete", "Post5" => "Gold"];
$order = array_flip(["Platinum", "Gold", "Silver", "Bronze", "Complete", "None", "Uncomplete"]);
// makes: array ('Platinum' => 0, 'Gold' => 1, 'Silver' => 2, 'Bronze' => 3, 'Complete' => 4, 'None' => 5, 'Uncomplete' => 6)
uasort($array, function ($a, $b) use ($order) {
return $order[$a] <=> $order[$b];
});
var_export($array);
输出:
array (
'Post1' => 'Platinum',
'Post3' => 'Gold',
'Post5' => 'Gold',
'Post2' => 'Bronze',
'Post4' => 'Uncomplete',
)