php7.0 ksort改变了,PHP ksort意外行为

参见英文答案 > ksort produces wrong result when dealing with alphanumeric characters                                    6个

让我从一开始就告诉你:我知道这个函数的排序标志.当我使用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

)

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

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

解决方法:

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

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

奇怪的行为肯定 – 不幸的是,当你的键看起来像整数(即使它们是字符串)时产生预期结果的最好方法是指定排序标志,如SORT_STRING,以确保每次都得到预期的结果.

标签:php,ksort

来源: https://codeday.me/bug/20190622/1261681.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值