0

巧合的是,我遇到了关于 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 变得无用,例如供应商、发票、项目编号等。

谢谢

4

2 回答 2

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)。

于 2014-05-22T05:13:43.027 回答
0

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

于 2014-05-22T05:11:41.713 回答