让我从一开始就告诉您:我知道此函数的排序标志。当我使用SORT_STRING
时,它可以很好地工作,但是默认标志SORT_REGULAR
却很奇怪,或者根本不起作用。
考虑如下数组。
$arr = [
'27a' => 'foo',
'27b' => 'foo',
'27c' => 'foo',
'27' => 'foo',
];
当我尝试使用ksort进行排序时,它给出的数组没有被任何明显的逻辑排序。
ksort($arr);
print_r($arr);
// this prints
Array
(
[27a] => foo
[27] => foo
[27b] => foo
[27c] => foo
)
可以说键既不是数字也不是字母数字,也不是自然排序的。更奇怪的是,当我更改源数组的顺序时,它给出了不同的结果:
$arr = [
'27a' => 'foo',
'27' => 'foo',
'27b' => 'foo',
'27c' => 'foo',
];
ksort($arr);
print_r($arr);
// this prints
Array
(
[27b] => foo
[27c] => foo
[27] => foo
[27a] => foo
)
有人知道这背后的逻辑吗?这是错误还是我错过了什么?
编辑:谢谢大家有兴趣回答我的问题。尽管已将其标记为重复,但另一个问题没有提到奇怪的部分:为什么更改源数组的顺序会更改结果?它应该在相同的输入集下给出相同的结果。我们也要讨论吗?
答案 0 :(得分:4)
发生这种情况的原因是,即使将其引用,它也会将像“ 27a”这样的键视为字符串,并将像“ 27”这样的键视为整数。如果从27键中删除引号,您将看到相同的结果。
而且,正如ksort page所说:“警告:对具有混合类型值的数组进行排序时要小心,因为sort()会产生不可预测的结果。”
奇怪的行为-不幸的是,当您拥有看起来像整数的键(即使它们是字符串)时,产生预期结果的最佳方法是指定排序标志(如SORT_STRING)以确保每次都能获得预期的结果