PHP ksort意外行为

时间:2018-10-22 17:13:43

标签: php ksort

让我从一开始就告诉您:我知道此函数的排序标志。当我使用SORT_STRING时,它可以很好地工作,但是默认标志SORT_REGULAR却很奇怪,或者根本不起作用。

考虑如下数组。

$arr = [
    '27a'   => 'foo',
    '27b'   => 'foo',
    '27c'   => 'foo',
    '27'    => 'foo',
];

当我尝试使用kso​​rt进行排序时,它给出的数组没有被任何明显的逻辑排序。

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
)

有人知道这背后的逻辑吗?这是错误还是我错过了什么?

编辑:谢谢大家有兴趣回答我的问题。尽管已将其标记为重复,但另一个问题没有提到奇怪的部分:为什么更改源数组的顺序会更改结果?它应该在相同的输入集下给出相同的结果。我们也要讨论吗?

1 个答案:

答案 0 :(得分:4)

发生这种情况的原因是,即使将其引用,它也会将像“ 27a”这样的键视为字符串,并将像“ 27”这样的键视为整数。如果从27键中删除引号,您将看到相同的结果。

而且,正如ksort page所说:“警告:对具有混合类型值的数组进行排序时要小心,因为sort()会产生不可预测的结果。”

奇怪的行为-不幸的是,当您拥有看起来像整数的键(即使它们是字符串)时,产生预期结果的最佳方法是指定排序标志(如SORT_STRING)以确保每次都能获得预期的结果