PHP数组键在一定数字范围内变为负值


PHP array keys changes to negative value between certain number range

碰巧我遇到了一个关于PHP数组和它的键的非常奇怪的行为。考虑这样创建一个PHP数组。

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

不知何故,数组键的值改变为一个完全不同的负数。这使我进行了一些进一步的调查,但仍然没有结论。在下面的示例中,我在数字范围2250572300和2250572500之间循环。对我来说,时间是有限的,所以我没有设法精确地指出这种现象是从什么数字开始发生的,因为我在大范围的数字中循环耗尽了内存。我认为应该在210亿到43亿之间。

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

我的问题是:有没有人知道这种情况是如何发生的,为什么会发生,目前正在做什么来解决这个问题?

从本质上讲,这是PHP的一个主要设计缺陷,当你在数组中处理数字时,可能会使PHP变得无用,例如供应商,发票,项目编号等。

谢谢

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

确认:

echo 2250572483 % PHP_INT_MAX; // => -2044394813

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

这与整数的保存方式有关。第一个位(从左边开始)表示你是正的+还是负的-通过这种行为,大整数的结果将是你描述它的方式。你有一个负整数