【问题标题】:PHP ksort unexpected behavior [duplicate]PHP ksort意外行为[重复]
【发布时间】:2018-10-22 17:13:42
【问题描述】:

让我从头告诉你:我知道这个函数的排序标志。当我使用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
)

正如人们所说的那样,键既不是numerically也不是alphanumerically也不是自然排序的。更奇怪的是,当我更改源数组的顺序时,它给出了不同的结果:

$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
)

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

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

【问题讨论】:

  • 感谢大家对我的问题感兴趣并回答。虽然它被标记为重复,但另一个问题没有提到更奇怪的部分:为什么更改源数组的顺序会改变结果?它应该使用相同的输入集给出相同的结果。我们也要讨论这个吗?

标签: php ksort


【解决方案1】:

发生这种情况的原因是因为它将像 '27a' 这样的键视为一个字符串,而将像 '27' 这样的键视为一个整数,即使它被引用了。如果从 27 键中删除引号,您将看到相同的结果。

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

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

【讨论】:

  • 谢谢。我应该面对这样一个事实,即来自 php.net/manual/en/function.sort.php 的 SORT_REGULAR 定义根本不可靠:“SORT_REGULAR - 正常比较项目(不要更改类型)”它错误地引导我认为它不会将数字字符串作为整数。