我有一个键=>值数组:
a => 2
c => 1
b => 3
我试过这个:
ksort($result);
arsort($result);
但这不起作用。我正在尝试按键按字母顺序 a-z 排序,然后按值升序 0-无穷大排序。
所以我应该得到
c => 1
a => 2
b => 3
但这些并没有给我我想要的。
尝试使用
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');
我得到了意想不到的结果,因为对具有相同值的值进行排序是不稳定的。
所以你在问题中忘记提到的是值可以出现两次,并且你希望数组其次按值和键排序。
c => 1
a => 2
z => 2
b => 3
PHP 中没有这样的函数。不过,您可以尝试先按键排序
ksort()
,然后应用用户定义的函数按值排序 uasort()
。在回调中,还必须实现 $a == $b
检查并返回 0。因此,之前的按键顺序可能不会被 +1 或 -1 比较状态意外更改。 (不知道是否真的有效。)
否则,您将必须自己实现整个排序算法,可能会在不同的映射中分离键和值。