【问题标题】:PHP's asort does not work properly?PHP 的 asort 不能正常工作?
【发布时间】:2012-01-21 06:34:44
【问题描述】:

我有一个示例数组:

$a = array(
    5   => 35,
    16  => 22,
    7   => 22,
    3   => 22,
    11  => 22,
    9   => 27,
);

我想按值对其进行排序并记住它的键。 我预期的结果是:

$a = array(
    16  => 22,
    7   => 22,
    3   => 22,
    11  => 22,
    9   => 27,
    5   => 35,
);

所以我的第一个想法是:asort! 好的,我做到了

asort($a);

但不——它不只是将5 => 35 移动到数组的末尾。 它将我的数组更改为:

$a = array(
    11  => 22,
    3   => 22,
    7   => 22,
    16  => 22,
    9   => 27,
    5   => 35
);

你看到了吗?具有相同值的键是反向排序的。为什么?

【问题讨论】:

  • 我并没有真正看出问题所在:asort() 不保证具有相同值的元素的特定排序顺序。
  • 我猜asort使用的排序算法不是stable

标签: php asort


【解决方案1】:

您不能期望相同的值有一定的排序顺序。来自PHP manual on Sorting Arrays

如果这些排序函数中的任何一个将两个成员计算为相等,则顺序未定义(排序不稳定)。

【讨论】:

    【解决方案2】:

    “为什么”是另一个问题。
    但它确实做到了你所要求的,不是吗?
    未确定密钥顺序。
    如果你想要特定的键顺序,你应该在练习条件中说明它

    【讨论】:

    • @hsz 您可能需要构建一个手动功能,以便在第一次排序后重新排序相等值的键。我在the list 中看不到现成的函数 - 或适合此的用户定义函数(但我可能是错的)
    【解决方案3】:

    http://en.wikipedia.org/wiki/Sorting_algorithm#Stability

    简而言之,确保已经排序的键的顺序保持不变将花费计算时间(并且在 PHP 中设计该函数的人认为它不值得)

    【讨论】:

      【解决方案4】:

      根据排序算法,它可能以另一种方式开始排序,而不仅仅是检测到它应该只移动那一对。但它最终得到了一个有效排序的数组来维护键/值。它们只是看起来交换了,因为您有 4 个值为 22 的键。

      【讨论】:

        猜你喜欢
        • 2014-05-14
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 2013-06-29
        • 2012-08-29
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多