PHP数组键在特定数字范围之间变为负值

时间:2014-05-22 05:04:32

标签: php arrays array-key

巧合的是,我遇到了一个关于PHP数组及其密钥的非常奇怪的行为。考虑一下这个PHP数组的创建。

$arr[2250572483]=1;
//dump the array
var_dump($arr);
//Result:
array(1) { [-2044394813]=> int(1) }

不知何故,数组键已将其值更改为完全不同的负数。这导致我进行了一些尚未确定的进一步调查 在下面的示例中,我在数字范围2250572300和2250572500之间循环。时间对我来说很重要,所以我无法确定这种现象开始发生的次数,因为我的内存耗尽了大量数字。我认为它应该介于2100000000和4300000000之间。

$arr2 = array();
for($i=2250572300; $i<= 2250572500; $i++){
  $arr2[$i]=$i;
}
echo "<pre>".var_export($arr2,true)."</pre>";

我的问题是:有没有人知道这是怎么发生以及为什么会发生这种情况,目前有什么方法可以解决这个问题吗?

基本上这是PHP中的一个主要设计缺陷,当您使用数组中的数字时,可能会使PHP无用,例如供应商,发票,项目编号等。

由于

2 个答案:

答案 0 :(得分:1)

您使用整数值作为数组键。 PHP中的所有整数都是有符号整数,在32位系统上,最大值为2 32 - 1(由PHP_INT_MAX给出)。如果整数值大于PHP_INT_MAX,那么它将换行并作为结果提供$key % PHP_INT_MAX

确认:

echo 2250572483 % PHP_INT_MAX; // => -2044394813

解决方案是将密钥用作字符串,即$arr['2250572483']=1;。但这在64位系统上应该不是问题(上限为2 64 - 1)。

答案 1 :(得分:0)

这与整数的保存方式有关。第一位(来自左侧)说你是积极+还是否定 - 并且通过这种行为,具有大整数的结果将是你如何描述它。你有一个否定的整数。