如何在PHP中使用arsort()进行稳定排序?

kulphzqa  于 2022-12-02  发布在  PHP
关注(0)|答案(7)|浏览(237)

我需要在php中对一个数组进行排序based on value,array使用一些数字作为键和值,例如:

$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,它工作正常,但有一个问题,因为此函数使更改defult sortedkeys和sort数组为:

Array
(
    [13] => 5
    [82] => 5
    [21] => 4
    [61] => 3
    [53] => 2
    [34] => 2
    [55] => 1
    [70] => 1
)
jvidinwx

jvidinwx1#

构造一个新数组,其元素为原始数组的键、值和位置:

$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];
}
huus2vyu

huus2vyu2#

作为参考,我在Github上放置了一组内置PHP函数的稳定排序变体:https://github.com/vanderlee/PHP-stable-sort-functions,基于@Barmar的解决方案和一些其他技巧。

7dl7o3gd

7dl7o3gd3#

这是因为sort系列的函数是不稳定的,如果你需要排序是稳定的,那么你要么自己实现它,要么迭代排序结果并使用array_splice“校正”元素的位置。

sf6xfgos

sf6xfgos4#

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);
kknvjkwl

kknvjkwl5#

这是一个很大的变通办法,但它确实有效:

$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" }
5rgfhyps

5rgfhyps6#

PHP使用快速排序作为基本的排序算法。你有两个选择:

  1. first使用usort并定义一个compare-function,它遵守前面的顺序
    1.编制自己稳定排序机制
    我在github上编写了一个Perl特/avalanchesort(https://github.com/porthd/avalanchesort)包,它包含了一个递归的naturell-merge-sort。你可以使用你自己的比较函数和数据结构。这个包包含了一个关联数组和列表数组的例子。
qyswt5oh

qyswt5oh7#

您可以创建自己的排序函数,以满足自定义排序条件,然后使用usort(),使用创建的函数遍历整个数组,以对数组进行排序。

相关问题