【PHP】多次元配列の次元数に上限があるのか気になって試した結果


先日、実務で五次元配列をごにょごにょしているコードに遭遇しました。
普段は三次元配列まででほぼ事足りるので印象に残るコードだったのですが、
ふと、PHPの配列の次元数はどこまでいけるのか気になってしまい調べてみることに。
マニュアルを漁ってもそれっぽい記載を見つけることはできませんでしたが、素敵なブログを発見。

PHPの制限一覧

配列型の要素数は内部で利用するハッシュのデータ構造定義に依存しています。

  • PHP 7.0未満は2^32個まで (uint32_tが利用されているが、実際には最大数に達する前に問題が発生すると考えられる)
  • PHP 7.0以上の場合、
    • size_tが32bitの場合は、0x04000000個まで
    • size_tが64bitの場合は、0x80000000個まで(通常は2^31個まで利用できる、と考えて良い)

実際は要素数の上限に達する以前にメモリが枯渇しますが上限は存在してそうです。
てことは、次元数についても同様にハッシュのデータ構造定義に依存しているって事になるのかな。

検証してみる

難しいことはよくわからないので実際に試してみます。

100次元配列を作成するコード
$x = [];
for ($i = 1; $i <= 100; ++$i) { $x = [$x]; }
print_r($x);

控え目に100次元配列を作成してみたところ普通にできました。
少し本気を出して、フリーザ様の第一形態の戦闘力:53万次元配列に挑戦してみたところ・・・作成できました!
その後、500万次元配列も試して作成できましたが、手元環境で10分以上かかってしまい心が折れて検証は終了しました。

検証結果:配列の次元数上限値なんてどうでもよくなった

おそらく、配列の次元数上限値はその配列の要素数に左右されるもの。
次元数上限値なんて気にする暇があるなら、お酒飲みにいこうぜ。