为什么大数组索引没有正确存储?

我正在处理涉及非常大的主键(12位数字)的数据。 当我尝试以id => value的forms将数据放入数组中时,索引未正确分配。

 $test = array(190337172011 => 'Apple'); print_r($test); 

结果:

 Array ( [1358610987] => Apple ) 

有时甚至会导致负数。 为什么会这样呢? 这是一个错误?

我在IIS上运行PHP 5.3.10。

您可能在32位Windows操作系统上使用32位PHP版本,例如Windows XP。

对于数字数组索引,PHP使用整数变量类型来存储密钥。 那些是有限的。 如果您选择一个大于限制值的限制,这个限制就会变得明显,这个限制会根据PHP版本和操作系统触发一个最大值或者一个转向。

190337172011对于您的系统中的整数类型来说太大了,这就是为什么您通过往返得到一个1358610987的结果。 往返意味着,在可能的最大正数之后,下一个数是可能的最小数,这是可以表示的“最大”负数。 这就是为什么你也得到负数。

您可以通过将值存储为需要预定义的字符串键来解决该问题:

 $test = array('ID' . 190337172011 => 'Apple'); print_r($test); 

这通常足以使您的代码更加便携。 您可以根据需要选择任意字符串前缀, ID只是示例,但您至少需要一个非数字字符。

整数的大小是依赖于平台的,尽管最大值约为20亿是通常的值(这是32位的)。 64位平台的最大值通常约为9E18。 PHP不支持无符号整数。 整数大小可以使用常量PHP_INT_SIZE确定,最大值使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX。

来源: http : //php.net/manual/en/language.types.integer.php