我需要在php中对数组进行排序基于值,数组使用一些数字作为键和值,例如这样:
$a = array(70 => 1 ,82 => 5 ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);
我喜欢这样排序:
Array
(
[82] => 5
[13] => 5
[21] => 4
[61] => 3
[34] => 2
[53] => 2
[70] => 1
[55] => 1
)
我使用了
arsort
并且它有效,但是有一个问题,因为这个函数使更改默认排序keys并将数组排序为:
Array
(
[13] => 5
[82] => 5
[21] => 4
[61] => 3
[53] => 2
[34] => 2
[55] => 1
[70] => 1
)
构造一个新数组,其元素是原始数组的键、值和位置:
$temp = array();
$i = 0;
foreach ($array as $key => $value) {
$temp[] = array($i, $key, $value);
$i++;
}
然后使用用户定义的顺序进行排序,并考虑原始位置:
uasort($temp, function($a, $b) {
return $a[2] == $b[2] ? ($a[0] - $b[0]) : ($a[2] < $b[2] ? 1 : -1);
});
最后将其转换回原来的关联数组:
$array = array();
foreach ($temp as $val) {
$array[$val[1]] = $val[2];
}
array_multisort
的简单解决方案。
$assoc = [
70 => 1,
82 => 5,
61 => 3,
55 => 1,
34 => 2,
53 => 2,
21 => 4,
13 => 5,
];
$keys = array_keys($assoc);
array_multisort($assoc, SORT_DESC, range(1, count($assoc)), $keys);
$assoc = array_combine($keys, $assoc);
print_r($assoc);
$a = array(70 => 1 ,82 => 5 ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);
$b = max($a);
$c = min($a);
$d = 0;
$sorted_list = array();
while($b >= $c){
foreach($a as $key => $value){
if($value == $b){
$sorted_list[$key] = $value;
}
}
$b--;
}
vardump 输出:
array(8) { [82]=> string(1) "5" [13]=> string(1) "5" [21]=> string(1) "4" [61]=> string(1) "3" [34]=> string(1) "2" [53]=> string(1) "2" [70]=> string(1) "1" [55]=> string(1) "1" }
https://github.com/porthd/avalanchesor),其中包含一个递归naturell-merge-sort。您可以使用自己的比较函数和自己的数据结构。该包包含关联数组和列表数组的示例。
PHP RFC:使排序稳定。
使用 PHP 7 时,我可以推荐vanderlee/php-stable-sort-functions 包,它为所有排序函数添加了稳定的替代方案。它们也可能比此处发布的其他代码性能更高,并且具有单元测试。从版本 2.0.6 开始,在 PHP 8 上运行时,它还会回退到本机内置函数,这使其成为需要在 PHP 7 和 PHP 8 上运行的库代码的理想选择。