按键 ASC 对数组进行排序,然后按值 ASC 排序

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

我有一个键=>值数组:

a => 2
c => 1
b => 3

我试过这个:

ksort($result);
arsort($result);

但这不起作用。我正在尝试按键按字母顺序 a-z 排序,然后按值升序 0-无穷大排序。

所以我应该得到

c => 1
a => 2
b => 3

但这些并没有给我我想要的。

php arrays sorting
2个回答
9
投票

尝试使用

asort()
而不是
arsort()
arsort()
将以相反的顺序对数组进行排序。 像这样的东西应该“有效”:

$test = array(
    'a' => 0,
    'b' => 1,
    'c' => 2
);
ksort($test);
asort($test);

马里奥是正确的,如果多个项目包含相同的值,这将不起作用。 或者,您可以使用 uksort(),它允许您准确定义数组的排序方式。 例如,您可以默认使用两个项目的值对它们进行排序。 但如果值按键排序相同。

$test = array(
    'a' => 2,
    'd' => 1,
    'c' => 1,
    'b' => 3
);
function cmp($a, $b){
    global $test;
    $val_a = $test[$a];
    $val_b = $test[$b];

    if($val_a == $val_b){
        return ($a < $b) ? -1 : 1;
    }
    return ($val_a < $val_b) ? -1 : 1;
}
uksort($test, 'cmp');

2
投票

我得到了意想不到的结果,因为对具有相同值的值进行排序是不稳定的。

所以你在问题中忘记提到的是值可以出现两次,并且你希望数组其次按值键排序。

c => 1
a => 2
z => 2
b => 3

PHP 中没有这样的函数。不过,您可以尝试先按键排序

ksort()
,然后应用用户定义的函数按值排序
uasort()
。在回调中,还必须实现
$a == $b
检查并返回 0。因此,之前的按键顺序可能不会被 +1 或 -1 比较状态意外更改。 (不知道是否真的有效。)

否则,您将必须自己实现整个排序算法,可能会在不同的映射中分离键和值。

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