Usort Without Replacing Keys PHP


Usort Without Replacing Keys PHP

我有重大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'

只需使用usortuasort整数。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);

该代码给出结果

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

usort没有保留密钥,如果您想在排序后保留密钥,则应该使用asort。希望这对你有所帮助。

考虑这些假设:

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

您可以通过将"映射数组"(也称为查找数组)传递为关联数组来简化自定义排序函数,该数组以"状态"为键,以"排序值"为值。我在下面使用array_flip(),但如果你愿意,你可以写出一维关联数组。

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

在php7中,您可以使用"太空船运算符"(也称为三向比较运算符)来巧妙地执行比较。

简洁高效。

代码:(演示)

$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+演示

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