没有替换密钥PHP的Usort

时间:2015-03-25 22:52:35

标签: php arrays usort

我有主要的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'

3 个答案:

答案 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)

考虑以下假设:

  1. 您的输入数组可能包含不唯一的值(Gold可能是多个帖子的值)。
  2. 知道(并可以列出)所有可能的值,这些值将用于对输入数组进行排序。 (不会有“异常值”)

您可以通过将“映射数组”(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',
)