在PHP中使用uasort访问数组键

时间:2015-07-02 11:37:55

标签: php arrays sorting usort

如果在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变量只是没有相应键的整数但是应该有一种方法可以访问因为我使用一个函数来实际保存密钥,所以也是关键。有什么想法吗?

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:0)

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()没有按原样排序&#39;但是会返回已排序的数组。当然还有:我的魔法&#34;关键排序是相当基本的。键将以与值相同的方式排序。通过修改语句$new[$k]="$v $k";,您可以根据需要更改行为。

作为附注......

只有当我使用use(&$arr)代替use($arr)时,

deceze的解决方案 才会在我的服务器上运行:

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