在 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;
});
如果 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;
});