PHP ksort 意外行为

标签 php ksort

<分区>

让我从头告诉你:我知道这个函数的排序标志。当我使用 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 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934511/

相关文章:

php - Magento 2 注册回调 URL/网络书,例如添加到购物车,无需在 Magento 中更改代码

php - 何时以及为什么应该使用 session_regenerate_id()?

java - Android 无法连接到本地主机或计算机 IP 地址

php - 按特定键对数组进行排序

php - ksort 在处理字母数字字符时产生错​​误的结果

c# - 在 C# 中模仿 PHP 的 ksort

php - 按自定义字母表对数组字符串类型的键进行排序?

php - 单元测试 cakephp 模型

javascript - 如何使用 POST 方法将 javascript/jQuery 变量传递给 PHP