【问题标题】:Access array key using uasort in PHP在 PHP 中使用 uasort 访问数组键
【发布时间】:2015-09-19 22:10:40
【问题描述】:

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

【问题讨论】:

  • 我们在这里谈论的是什么魔法?可能还有其他方法可以做到这一点。
  • 应用程序的“魔法”或逻辑非常混乱,因为如果整数相等,它会涉及特殊的数据库查询。幸运的是,大多数时候它们不是,我可以想到一种解决方法,例如,通过创建另一个二维数组,将整数作为一个值,将键作为另一个值,然后将其提供给 uasort。不过,我希望有更好、更简单的方法来做到这一点。

标签: php arrays sorting usort


【解决方案1】:
uksort($arr, function ($a, $b) use ($arr) {
    return $arr[$a] - $arr[$b] ?: $a - $b;
});

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

【讨论】:

  • 只是出于兴趣:这只是我的 PHP 5.3.1 环境,还是其他用户也发现了 use() 子句的问题?
  • 如果您使用use(&amp;$arr) 而不仅仅是use($arr),它也适用于我的环境。 $arr 的内容(即顺序)随时间而变化,use($arr) 只能使用静态副本,请参见此处:php.net/manual/de/functions.anonymous.php
  • 谢谢,正是我需要的。我来宾 'uasort' 只是在这种情况下使用的错误功能。我在 PHP 5.4 和 5.5 上运行,所以“使用”没有问题,开箱即用。
【解决方案2】:

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() 不会“就地”排序,但会返回排序后的数组。当然:我对键排序的“魔法”相当基础。键的排序方式与值的排序方式相同。通过修改 $new[$k]="$v $k"; 语句,您可以更改行为以满足您的需要。

附注...

deceze 的解决方案仅在我使用 use(&amp;$arr) 而不是 use($arr) 时在我的服务器上工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2019-06-14
    • 1970-01-01
    • 2015-08-02
    • 2022-01-03
    相关资源
    最近更新 更多