2012-04-29 14 views
1

私は非常に大きな主キー(12桁)を含むデータを扱っています。 id => valueの形式で配列にデータを格納しようとすると、インデックスが正しく割り当てられません。大きな配列インデックスが正しく格納されないのはなぜですか?

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

結果:

Array ([1358610987] => Apple) 

時にはそれも負の数になります。なぜこれが起こるのですか?バグですか?

IISでPHP 5.3.10を実行しています。

+2

これは32ビット版または64ビット版のPHPですか? 32ビットプラットフォームの場合、これらのキーを格納する領域が不足します。http://php.net/manual/en/language.types.integer.php –

+0

[この質問を見る] /stackoverflow.com/q/467149/825789)、メモリ問題のように見えます。 – bfavaretto

+0

@bfavaretto:メモリが多すぎる場合、スクリプトは終了します。間違った結果を返さない。 –

答えて

0

あなたは例のWindows XPのために、おそらく32ビットのWindowsオペレーティングシステム上で32ビットのPHPのバージョンを使用しています。

数値配列インデックスの場合、PHPは整数変数型を使用してキーを格納します。それらは限られています。この制限は、PHPのバージョンとオペレーティングシステムに応じて最大値または最大値をトリガする制限値を超える値を選択した場合に表示されます。

値は、システム上の整数型のサイズが大きすぎます。そのため、往復で上限を得て、結果は1358610987になります。ラウンドトリップとは、可能な最大正数の後に、次の数が可能な限り小さい数であり、表現できる「最大の」負の数であることを意味します。だからあなたも負の数を得るのです。

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

これは、通常は十分なあなたのコードの移植性を高めることです。

あなたは、いくつかの事前の固定を必要とする文字列キーとして値を格納することによってすることを回避することができます。任意の文字列接頭辞を好きなように選択することができます。IDは単なる例ですが、少なくとも1つの非数字文字が必要です。

+0

説明をありがとう。私は配列を構築するときにidを文字列として単にキャストするようにも動作することに気づいていました。 – Mike

+0

文字列にキャストすることは必ずしも機能しません。おそらく、大きすぎる数字の場合はうまくいきます(これは気の利いたトリックです)。 – hakre

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

関連する問題