在 PHP 中使用 uasort 访问数组键

Access array key using uasort in PHP

如果 PHP 中有一个相当基本的 uasort 函数,如下所示:

uasort($arr, function($a, $b) {
                if ($a > $b)
                    return -1;
                if ($a < $b)
                    return 1;
...
}

我要排序的数组如下所示:

{[1642] => 1, [9314] => 4, [1634] => 3 ...}

它包含整数,这是我的主要比较标准。但是,如果整数相等,那么我想在 uasort 函数内部访问它们的键值,并用它做一些魔术来从那里找出排序。

我不知道该怎么做,因为似乎传递给函数的 $a$b 变量只是没有相应键的整数,但应该有办法也可以访问密钥,因为我正在使用一个函数来实际保留密钥。有什么想法吗?

uksort($arr, function ($a, $b) use ($arr) {
    return $arr[$a] - $arr[$b] ?: $a - $b;
});

您可以通过键获取值,因此使用 uksort 为您提供键。将 $a - $b 替换为您合适的魔法,这里只是按键的值排序。

use 指令(在 deceze 的解决方案中)在我的旧 PHP 5.3.1 安装中不起作用,而这将提供结果:

$arr=array('1642'=>1,'9314'=>2,'1634'=>1,'1633'=>5,'1636'=>7,'1610'=>1);
print_r($arr);

function mycmp($a, $b) {
 if ($a > $b)  return -1;
 if ($a < $b)  return 1;
 else return 0;
}
function mysrt($arr){
 foreach ($arr as $k => $v) $new[$k]="$v $k";
 uasort($new, 'mycmp'); $ret=array();
 foreach ($new as $k => $v) $ret[$k]=$arr[$k];
 return $ret;
}
print_r(mysrt($arr));

mysrt() 不会对 'in-place' 进行排序,但会对 return 排序的数组进行排序。当然:我的 "magic" 键排序是相当基础的。键将按照与值相同的方式排序。通过修改语句 $new[$k]="$v $k";,您可以更改行为以满足您的需要。

作为旁注...

deceze 的解决方案 只有在我使用 use(&$arr) 而不是 use($arr) 时才能在我的服务器上工作:

uksort($arr, function ($a, $b) use(&$arr) {
    return $arr[$a] - $arr[$b] ? $arr[$a] - $arr[$b] : $a - $b;
});