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

问题描述 投票:0回答:7

我需要在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
)
php arrays sorting
7个回答
14
投票

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

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


4
投票
使用

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

2
投票
这是一个很大的解决方法,但它确实有效:

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

0
投票
PHP 使用快速排序作为基本排序算法。 您有两个选择:

    first 使用 usort 并定义一个比较函数,该函数尊重之前的顺序
  1. 编写您自己的稳定排序机制
我在github上编写了一个包porth/avalanchesort(

https://github.com/porthd/avalanchesor),其中包含一个递归naturell-merge-sort。您可以使用自己的比较函数和自己的数据结构。该包包含关联数组和列表数组的示例。


0
投票
您可以创建满足您的自定义排序标准的自己的排序函数,然后使用您创建的函数对数组进行排序,然后使用 usort() 迭代整个数组。


© www.soinside.com 2019 - 2024. All rights reserved.