如何使用arsort()在PHP中进行稳定排序?
我需要在php中根据值对数组进行排序,数组使用一些数字作为键和值,例如:如何使用arsort()在PHP中进行稳定排序?,php,arrays,sorting,Php,Arrays,Sorting,我需要在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
$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
,它工作正常,但存在一个问题,因为此函数使change-defult-sorted键和sort-array变为:
Array
(
[13] => 5
[82] => 5
[21] => 4
[61] => 3
[53] => 2
[34] => 2
[55] => 1
[70] => 1
)
这是因为
排序
函数系列不可用。如果您需要排序保持稳定,那么您要么自己实现它,要么迭代排序结果,然后使用“更正”元素的位置。这是一个很大的解决方法,但它确实有效:
$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--;
}
变量转储输出:
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" }
您可以创建自己的排序函数以满足自定义排序条件,然后使用usort()在整个数组中使用您创建的排序函数进行迭代。构建一个新数组,其元素为原始数组的键、值和位置:
$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);
});
作为参考,我在Github:上放置了一组内置PHP函数的稳定排序变体,基于@Barmar的解决方案和其他一些技巧。使用
数组的简单解决方案\u multisort
PHP使用快速排序作为基本排序算法。 你有两个选择:
我在github上编写了一个包porth/avalanchesort(),其中包含一个递归的naturell合并排序。您可以使用自己的比较函数和数据结构。该软件包包含关联数组和列表数组的示例。@MadaraUchiha:我不太确定。除非我弄错了,否则OP需要的是一个稳定的排序,而不是多条件排序。我读了所有的排序,没有一个与这个问题完全相关+我只想添加一个链接,更详细地描述创建排序函数的过程。)这样怎么样:阿尔索特($a);阿索尔(a美元);阿索特(a美元);这成功了@瓦希德:它碰巧起作用了。不能保证它下次能用。太好了!但是为什么我得到$sorted_list[$key]行的未定义偏移量=$value;?我不知道你为什么会这样,而我没有,但我知道如何修复它。在我的回答中添加了两行。错误消失了,但数组有错误的空值:数组([70]=>1[82]=>[61]=>[55]=>1[34]=>[53]=>[21]=>[13]=>)他可以使用什么排序函数来获得稳定的排序?数组中的原始位置不会作为参数传递给比较函数。太棒了!这真的帮了我很大的忙!此功能应该在PHP核心中!:-)有趣的是,近5年来,没有人注意到它不是
($a[0]>$b[0])
,而是($a[0]>$b[0]-1:-1)
,否则会在反向元素上返回false
,这会导致未定义的顺序。(还要注意,$a[0]==$b[0]
是不可能的。)@WalterTross抓得好。我将其更改为$a[0]-$b[0]
。我还可以将末尾的三元数更改为$b[2]-$a[2]
,但如果它没有损坏。。。
$array = array();
foreach ($temp as $val) {
$array[$val[1]] = $val[2];
}
$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);