我发现了一些奇怪的东西,不明白它为什么会这样运作。
我有一个数字数组,里面所有的数字都是唯一的:
$array = [
98602142989816970,
98602142989816971,
98602142989816980,
98602142989816981,
98602142989816982,
98602142989816983,
98602142989820095,
98602142989820096,
98602142989822060,
98602142989822061,
];
var_dump($array);
array(10) {
[0]=>
int(98602142989816970)
[1]=>
int(98602142989816971)
[2]=>
int(98602142989816980)
[3]=>
int(98602142989816981)
[4]=>
int(98602142989816982)
[5]=>
int(98602142989816983)
[6]=>
int(98602142989820095)
[7]=>
int(98602142989820096)
[8]=>
int(98602142989822060)
[9]=>
int(98602142989822061)
}
如果我执行print_r(array_unique($array));
,一切都很好,我会得到:
Array
(
[0] => 98602142989816970
[1] => 98602142989816971
[2] => 98602142989816980
[3] => 98602142989816981
[4] => 98602142989816982
[5] => 98602142989816983
[6] => 98602142989820095
[7] => 98602142989820096
[8] => 98602142989822060
[9] => 98602142989822061
)
但如果我添加SORT_NUMERIC
标志 print_r(array_unique($array, SORT_NUMERIC));
,我会得到:
Array
(
[0] => 98602142989816970
[6] => 98602142989820095
[8] => 98602142989822060
)
为什么只返回这三个数字?
更新: 我正在64位系统上。
对于sort
函数,我手动打乱了一些值,因为在原始数组中它们已经排序。
如果我执行sort($array);
,则响应如预期:
Array
(
[0] => 98602142989816970
[1] => 98602142989816971
[2] => 98602142989816980
[3] => 98602142989816981
[4] => 98602142989816982
[5] => 98602142989816983
[6] => 98602142989820095
[7] => 98602142989820096
[8] => 98602142989822060
[9] => 98602142989822061
)
但是使用sort($array, SORT_NUMERIC);
排序时,它们的顺序不正确:
Array
(
[0] => 98602142989816970
[1] => 98602142989816982
[2] => 98602142989816983
[3] => 98602142989816980
[4] => 98602142989816981
[5] => 98602142989816971
[6] => 98602142989820095
[7] => 98602142989820096
[8] => 98602142989822060
[9] => 98602142989822061
)
9.8602142989817E+16
、9.8602142989817E+16
等。如果你使用的是64位系统,这些整数本来就可以正确表示,但当SORT_NUMERIC函数被调用时,可能会出现问题——也许它再次强制使用32位或将其转换为浮点数内部处理等。 - CBroesort()
而不是使用标志,它是否有效? - Mark Overton