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

时间:2012-04-29 01:38:11

标签: php windows

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

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

结果:

Array ( [1358610987] => Apple ) 

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

我在IIS上运行PHP 5.3.10。

2 个答案:

答案 0 :(得分:2)

整数的大小取决于平台,尽管最大值约为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

答案 1 :(得分:0)

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

对于数值数组索引,PHP使用整数变量类型来存储键。这些都是有限的。如果您选择的值大于限制值,则会出现此限制,该限制将触发最大值或周转率,具体取决于PHP版本和操作系统。

190337172011太大了系统中的整数类型,这就是为什么你通过往返获得1358610987结果的上限。往返意味着,在可能的最大正数之后,下一个数字是可能的最低数字,这是可以表示的“最大”负数。这也是你得到负数的原因。

您可以通过将值存储为需要一些预先修复的字符串键来解决这个问题:

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

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