不替换键的 Usort PHP

Usort Without Replacing Keys PHP

我遇到了主要的 usort() 问题! :( 所以基本上我想按它们的值对我的数组进行排序。我希望值按以下顺序显示:Platinum、Gold、Silver、Bronze、Complete、None、Uncomplete。现在我可以很好地对它们进行排序,但我想保留他们的密钥(这可能吗?)。这是我的代码:

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'

只需使用 uasort 而不是 usortuasort 的定义是

Sort an array with a user-defined comparison function and maintain index association.

您的比较函数和 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);

该代码给出结果

Array
(
    [post3] => Platinum
    [post1] => Gold
    [post2] => None
)

usort没有保留key,如果你想在排序后保留key那么你应该使用asort。希望对你有帮助。

考虑到这些假设:

  1. 您的输入数组可能包含不唯一的值(Gold 可能是多个帖子的值)。
  2. 知道(并且可以列出)将用于对输入数组进行排序的所有潜在值。 (不会有"outliers")

您可以通过将 "mapping array"(又名查找数组)作为关联数组传递来简化您的自定义排序函数,该关联数组具有 "status" 作为键和 "sorting value" 作为值。我在下面使用 array_flip(),但如果您愿意,您可以写出一维关联数组。

当调用 uasort() 调用自定义排序函数并保留输入数组的键时,使用 use() 在函数范围内传递查找数组。

从 php7 开始,您可以使用 "spaceship operator"(又名三向比较运算符)巧妙地执行比较。

简洁、简洁、高效。

代码:(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',
)

从PHP7.4开始,您可以使用箭头语法来省略use()声明并缩短总语法。

PHP7.4+ Demo

uasort($array, fn($a, $b) => $order[$a] <=> $order[$b]);