この記事のゴール
- PHPの配列要素数の上限がわかる
結論から言うと
PHP公式ドキュメントの配列のページには、
配列要素数の上限について記載がありません。
が、PHPの配列要素数の上限は整数の上限です。
PHPの整数の上限
PHP公式ドキュメントによると、整数の上限は次の通りです。
▼32bit-system: 2147483647 (= 2 ^ 31 – 1)
※扱える値は -2147483648 ~ 2147483647
※個数としては 2147483648 x 2個 (= 2^32個) です。
▼64bit-system: 9223372036854775807 (= 2 ^ 63 – 1)
※扱える値は -9223372036854775808 ~ 9223372036854775807
※個数としては 9223372036854775808 x 2個 (= 2 ^ 64個)です。
これらの値は、PHPの定義済み定数で取得できます。
- 整数の上限値: PHP_INT_MAX
- 整数の下限値: PHP_INT_MIN
検証コード
配列要素数の上限付近の検証コードを作成してみました。
このコードはGistに掲載しておきました。
実行してみます。
~/work/phptest$ php -f verifyLimitOfArrayElemets.php
array(1) {
[-9223372036854775808]=>
string(3) "foo"
}
float(-9.223372036854776E+18)
array(1) {
[-9223372036854775808]=>
string(3) "bar"
}
array(2) {
[-9223372036854775808]=>
string(3) "bar"
[9223372036854775807]=>
string(3) "baz"
}
PHP Fatal error: Uncaught Error: Cannot add element to the array as the next element is already occupied in /home/macocci7/work/phptest/verifyLimitOfArrayElemets.php:37
Stack trace:
#0 {main}
thrown in /home/macocci7/work/phptest/verifyLimitOfArrayElemets.php on line 37
筆者の環境は64bit-systemです。
PHP_INT_MIN === -9223372036854775808
PHP_INT_MAX === 9223372036854775807
なので、14行目の配列インデックスの最小値の要素追加
$a[PHP_INT_MIN] = 'foo';
は成功しており、var_dump() による出力で
配列要素の代入が成功していることが確認できます。
array(1) {
[-9223372036854775808]=>
string(3) "foo"
}
20行目では、整数の下限を下回る値の扱いを確認するために
敢えて変数 $i に値を代入して、var_dump() で出力しています。
$i = PHP_INT_MIN - 1;
var_dump($i);
ここでは、$i は整数として扱えないので浮動小数点数に変換されていることがわかります。
float(-9.223372036854776E+18)
25行目では、この $i を引数として要素を追加しようとしています。
※浮動小数点数を配列引数にすることに問題はありますが。
$a[$i] = 'bar';
var_dump($a);
結果、浮動小数点数 $i の値は整数に変換されてから整数インデックスとして使用されますが、
扱える整数の下限が PHP_INT_MIN なので、
結果としては14行目で代入した要素が上書きされてしまいます。
array(1) {
[-9223372036854775808]=>
string(3) "bar"
}
$a[PHP_INT_MIN – 1] = ‘bar’;
としても結果は同じです。
※ array_unshift() を使うと前に要素追加できますが、配列インデックスが0から振り直しされます。
32行目では、整数上限値 PHP_INT_MAX をインデックスとした要素を追加しています。
$a[PHP_INT_MAX] = 'baz';
var_dump($a);
これは成功しています。
array(2) {
[-9223372036854775808]=>
string(3) "bar"
[9223372036854775807]=>
string(3) "baz"
}
が、37行目で次の要素、
つまり $a[9223372036854775808]への値代入は失敗し、
$a[] = 'qux';
「PHP Fatal error」となっています。
38行目の var_dump() は、37行目のエラーでコード実行が停止されたため実行されていません。
エラーメッセージを確認してみると、
Cannot add element to the array as the next element is already occupied
「配列への要素追加はできないよ、
だって次の要素はすでに占有されてるもん。」
だそうです。
コメント