使用uasort在PHP中访问数组键

11

如果您有一个相当基本的 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 变量只是整数,没有相应的键,但应该有一种方法可以访问键,因为我正在使用一个函数来保留键。有任何想法吗?


我们在谈论什么神奇的东西?可能还有其他方法可以做到这一点。 - Andrei
应用程序的“魔法”或逻辑相当混乱,因为它涉及特殊的DB查询,如果整数相等。幸运的是,大多数情况下它们并不相等,我可以想到一个解决方法,例如创建另一个2D数组,将整数作为一个值和键作为另一个值,然后将其提供给uasort。但是,我希望有更好、更容易的方法来做到这一点。 - mmvsbg
2个回答

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

通过键可以获取值,因此使用 uksort,它会给你键。用适当的方法替换$a-$b,这里只是按键的值排序。


仅出于兴趣:是我的PHP 5.3.1环境有问题,还是其他用户也观察到了use()子句的问题? - Carsten Massmann
1
如果您使用use(&$arr)而不是use($arr),它也可以在我的环境中工作。 $arr的内容(即顺序)会随时间变化而改变,而use($arr)只能使用静态副本,请参见此处:http://php.net/manual/de/functions.anonymous.php。 - Carsten Massmann
谢谢,正是我需要的。我猜'uasort'在这种情况下只是错误的函数使用。我正在运行PHP 5.4和5.5,所以'use'没有问题,可以直接使用。 - mmvsbg

0

在 deceze 的解决方案中,use 指令在我旧的 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() 不会在原地排序,但会返回已排序的数组。当然,我的键排序“魔法”相当基础。键将以与值相同的方式进行排序。通过修改语句$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;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接