巧合的是,我遇到了一个关于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无用,例如供应商,发票,项目编号等。
由于
答案 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)
这与整数的保存方式有关。第一位(来自左侧)说你是积极+还是否定 - 并且通过这种行为,具有大整数的结果将是你如何描述它。你有一个否定的整数。