【问题标题】:PHP How to sort associative array first by keys then by values?PHP如何先按键然后按值对关联数组进行排序?
【发布时间】:2011-03-21 12:55:53
【问题描述】:
$arr =array(
    28 => 23,
    26 => 23,
    15 => 12,
    29 => 12,
    1 => 12,
    16 => 15,
    30 => 15,
    11 => 12,
    8 => 23,
    33 => 23
);

如何排序:

8 => 23
26 => 23
28 => 23
33 => 23
16 => 15
30 => 15
1 => 12
11 => 12
15 => 12
29 => 12

【问题讨论】:

  • 您的数组只是按值排序,是吗?
  • 你必须编写你的函数并将其用作 uksort() 回调
  • 我已将您的两个帐户合并在一起。 Please read this Faq entry about cookie-based accounts. 另外,StackOverflow 不是论坛;如果您有新问题,请提出新问题。如果您想在问题中包含更多信息,请edit it。如果您想与其中一位已回答的人互动,可以给他们留言。

标签: php arrays sorting key


【解决方案1】:

使用uksort,但使数组可用于比较函数,以便按值进行二次比较。将其设为全局变量将是最快且最脏的方法。

【讨论】:

  • 不错的解决方案。使用闭包并使用 use 传递数组的副本会很好......请注意,在将数组传递给闭包之前,您实际上必须将数组传递给不同的变量。
【解决方案2】:

您可以使用uksort(),它使自定义回调可以查看键,并间接查看它们的关联值。然后,决定进行哪些比较并返回适当的大于小于或零值以影响排序顺序是一件简单的事情。

这是一个在临时变量周围使用闭包的示例(请参阅Jacob's comment),这应该是有意义的。

$temp = $arr;
uksort($arr, function ($a,$b) use ($temp) {
    // Same values, sort by key ascending
    if ($temp[$a] === $temp[$b]) {
        return $a - $b;
    }
    // Different values, sort by value descending
    return $temp[$b] - $temp[$a];
});
unset($temp);
print_r($arr);

【讨论】:

    【解决方案3】:

    这很容易。首先使用ksort,然后对新的排序数组使用asort。你会找到你的结果。

    【讨论】:

    • PHP 的数组排序函数使用的是不稳定的快速排序。所以这不能保证。
    • @Jacob。对不起,伙计,我没明白你的意思。请解释我并纠正我...
    • Stability。在快速排序中,如果两个元素相等,则不能保证它们保持原来的顺序。
    • @Jacob,我相信在这种情况下没关系,因为不会有相等的项目 - 每个数组元素都有唯一的键,在 mike 的情况下考虑了这一点。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2023-03-30
    • 2019-06-26
    • 2019-01-26
    相关资源
    最近更新 更多