在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值相同。
这个问题有什么解决方案吗?我想要的顺序应该是肯定的。如果某些索引的值相同,则按降序或升序排序。
答案 0 :(得分:5)
如果这些排序函数中的任何一个将两个成员评估为相等,则订单未定义(排序不稳定)。
答案 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)并且你认为它是按键排序的。多变量显然不是这种情况。