【问题标题】:PHP array keys changes to negative value between certain number rangePHP数组键在特定数字范围内更改为负值
【发布时间】:2023-04-06 01:59:01
【问题描述】:

巧合的是,我遇到了关于 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 无用。

谢谢

【问题讨论】:

标签: php arrays array-key


【解决方案1】:

您使用整数值作为数组键。 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)。

【讨论】:

  • 嗨,Amal,简单地在数字周围加上引号并不能使它成为 PHP 中的字符串,因此为什么 "3"*4=12 有效。 $arr['2250572483']=1 还是有问题。像 $arr[(string)2250572483] 这样的事情是行不通的。我意识到问题是 32 位计算机系统,但我仍然应该能够将 2250572483 显式设置为字符串值。 PHP 将它视为一个数字,即使它包含在引号内。您可以执行 $arr["2250572483 "]=1 之类的操作,然后对其进行修剪,但是为什么我必须这样做。问题是如果所有字符都是数字,PHP 会将字符串解释为数字。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多