不替换键的 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
而不是 usort
。 uasort
的定义是
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
。希望对你有帮助。
考虑到这些假设:
- 您的输入数组可能包含不唯一的值(
Gold
可能是多个帖子的值)。
- 您知道(并且可以列出)将用于对输入数组进行排序的所有潜在值。 (不会有"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()
声明并缩短总语法。
uasort($array, fn($a, $b) => $order[$a] <=> $order[$b]);
我遇到了主要的 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
而不是 usort
。 uasort
的定义是
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
。希望对你有帮助。
考虑到这些假设:
- 您的输入数组可能包含不唯一的值(
Gold
可能是多个帖子的值)。 - 您知道(并且可以列出)将用于对输入数组进行排序的所有潜在值。 (不会有"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()
声明并缩短总语法。
uasort($array, fn($a, $b) => $order[$a] <=> $order[$b]);