arsort() 不为具有相同值的元素提供稳定的排序[重复]

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

我想按值的相反顺序对数组进行排序。我使用了 arsort php 函数,但结果对我来说不好。

示例:

我想对下一个数组进行排序:

$myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4,  "e" => 2); 

使用arsort()后,结果是:

$myArray = array ( "c" => 4, "b" => 3, "e" => 2, "f" => 2, "d" => 1 );

这不好,因为 arsort 函数不保持数组中元素的初始顺序。

我想要的结果是:

$myArray = array ( "c" => 4, "b" => 3, "f" => 2, "e" => 2, "d" => 1 );

f
e
顺序之前,就像来自原始数组一样。具有相同值的键不反转。

php arrays sorting stable-sort
6个回答
4
投票

编辑: 这对于内置函数来说是不可能的,您需要实现自己的排序解决方案。您可以按照我打开的这个问题来了解更多。


这些解决方案起作用纯属巧合:

$myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4,  "e" => 2);
uasort($myArray, function($a, $b){
    if($a == $b)
        return 1;
    else
        return $b - $a;
});
print_r($myArray);

$myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4,  "e" => 2);
uasort($myArray, function($a, $b){
    return $a <= $b;
});
print_r($myArray);

3
投票

这对我有用。

由于 asort 和 arsort 函数似乎按降序键值对具有相等值的行进行排序,因此如果值相等,则 arsort 会将较低的键值“切换”为较高的键值。

我的解决方案是从低到高排序(排序),这仍然会进行不需要的行翻转,然后反转数组,将具有相同值的行移回各自正确的位置。

原始:数组 ( [0] => 1 [1] => 0.5 [2] => 2 [3] => 3 [4] => 0.5 )

已排序:数组 ( [4] => 0.5 [1] => 0.5 [0] => 1 [2] => 2 [3] => 3 ) - 请注意,相同值行的键值已翻转

reversed: Array ( [3] => 3 [2] => 2 [0] => 1 [1] => 0.5 [4] => 0.5 ) - 现在您已经对数组进行了反向排序并保持了行的键完整性具有相同的值。

$array=array(1,.5,2,3,.5);
asort($array);
$array=array_reverse($array,TRUE);

0
投票

请尝试这个

arsort($array, krsort($array));

0
投票

我认为你最好的选择是使用 uasort php 函数。 在您的情况下使用 uasort 的优点是您可以更改定义自己的排序算法,而不是与 php asort 比较方法联系在一起。

您必须定义一个回调函数来评估第一个值是否小于、大于或等于第二个值。

你必须查看php官方在线文档才能了解这个函数的作用,但我认为很容易掌握,所以我将针对你的问题留下我自己的解决方案。

function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? 1 : -1;
}

使用此回调函数,当键具有相同值时,您可以进行反向排序,同时保持键的原始顺序。

最好的, 德米安


0
投票

一种简单、适用于任何地方的方法是:

<?php $a = array_flip($a); ksort($a); $a = array_flip($a); ?>
  1. Array_flip 翻转每个键 <==> 值。
  2. 按“现在键”对数组进行排序;
  3. 再次Array_flip以获取前一个星座和按值排序的数组。

-- 附:-- 为什么搞得这么复杂? @其他人。


0
投票

下一个数组似乎没有响应是正确的:

$myArray = array( 
    "d" => 1, "Mircea Anca" => 2, 
    "b" => 3, "Iuliana Moise" => 2, 
    "c" => 4, "Florina Popescu" => 2 )
© www.soinside.com 2019 - 2024. All rights reserved.