3

我有一个示例数组:

$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
);

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

4

4 回答 4

11

您不能期望相同值的特定排序顺序。来自关于排序数组的 PHP 手册

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

于 2010-09-08T10:14:05.227 回答
2

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

于 2010-09-08T10:12:22.830 回答
2

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

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

于 2010-09-08T11:08:57.593 回答
1

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

于 2010-09-08T10:15:19.630 回答