使用arsort排序不稳定

时间:2014-01-02 12:10:55

标签: php sorting

在php asort,arsort中有一个奇怪的问题。

我以arsort

为例

案例1

$a = array(
    1 => 2,
    2 => 1,
    3 => 2,
    4 => 1
);
arsort($a);
var_dump($a);

输出:

array(4) {
  [3] =>
  int(2)
  [1] =>
  int(2)
  [4] =>
  int(1)
  [2] =>
  int(1)
}

这里索引(3,1)和(4,2)按降序排序,因为索引3和1的值相同。索引4和2也是如此。

情况2

$a = array(
    1 => 2,
    2 => 1,
    3 => 2
);
arsort($a);
var_dump($a);

输出:

array(3) {
  [1] =>
  int(2)
  [3] =>
  int(2)
  [2] =>
  int(1)
}

这里索引(3,1)按升序排序,仍然在索引3处,1值相同。

这个问题有什么解决方案吗?我想要的顺序应该是肯定的。如果某些索引的值相同,则按降序或升序排序。

2 个答案:

答案 0 :(得分:5)

根据PHP documentation

  

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

答案 1 :(得分:0)

您只能使用2个元素进行测试,无法确切知道哪种行为是正确的。这是一个包含多个元素(奇数和偶数)的数组。

偶数:

<?php

$a = array(
    1 => 2,
    2 => 1,
    3 => 2,
    4 => 1,
    5 => 2,
    6 => 1,
    7 => 2,
    8 => 1,
    9 => 2,
    10 => 1,
    11 => 2,
    12 => 1
);
arsort($a);
var_dump($a);

<强>结果:

array (size=12)
  1 => int 2
  7 => int 2
  5 => int 2
  11 => int 2
  9 => int 2
  3 => int 2
  10 => int 1
  12 => int 1
  6 => int 1
  2 => int 1
  4 => int 1
  8 => int 1

奇数

<?php

$a = array(
    1 => 2,
    2 => 1,
    3 => 2,
    4 => 1,
    5 => 2,
    6 => 1,
    7 => 2,
    8 => 1,
    9 => 2,
    10 => 1,
    11 => 2,
    12 => 1,
    13 => 2
);
arsort($a);
var_dump($a);

<强>结果

array (size=13)
  9 => int 2
  11 => int 2
  13 => int 2
  1 => int 2
  7 => int 2
  3 => int 2
  5 => int 2
  12 => int 1
  2 => int 1
  4 => int 1
  8 => int 1
  6 => int 1
  10 => int 1

现在的问题是,它在哪里添加了第13个元素(= 2)?它刚好在第11个元素之后和第一个元素之前添加......这意味着这里没有规则。 (至少根据我们的看法)。

我们不能说它遵循任何规则,仅使用2个变量进行测试,就像你所做的那样,因为你看到了(1,3)并且你认为它是按键排序的。多变量显然不是这种情况。