参见英文答案 > ksort produces wrong result when dealing with alphanumeric characters 6个
让我从一开始就告诉你:我知道这个函数的排序标志.当我使用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
)
有谁知道这背后的逻辑?这是一个错误还是我错过了什么?
编辑:谢谢大家对我的问题感兴趣和回答.虽然它被标记为重复,但另一个问题没有提到更奇怪的部分:为什么更改源数组的顺序会改变结果?它应该使用相同的输入集给出相同的结果.我们也要讨论这个吗?
解决方法:
之所以发生这种情况,是因为它将像’27a’这样的键视为一个字符串,并将像’27’这样的键视为整数,即使它被引用.如果从27键中删除引号,您将看到相同的结果.
并且,正如ksort page所说:“警告:在对具有混合类型值的数组进行排序时要小心,因为sort()会产生不可预测的结果.”
奇怪的行为肯定 – 不幸的是,当你的键看起来像整数(即使它们是字符串)时产生预期结果的最好方法是指定排序标志,如SORT_STRING,以确保每次都得到预期的结果.
标签:php,ksort
来源: https://codeday.me/bug/20190622/1261681.html