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 に答える