Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用arsort()在PHP中进行稳定排序?_Php_Arrays_Sorting - Fatal编程技术网

如何使用arsort()在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

我需要在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
,它工作正常,但存在一个问题,因为此函数使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使用快速排序作为基本排序算法。 你有两个选择:

  • 首先使用usort并定义一个比较函数,该函数遵循前一个顺序
  • 编写自己的稳定排序机制

  • 我在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);