PHP

PHPの配列キーのキャストに関する挙動とPHPマニュアル考古学

突然ですが、下記のコードで配列 $a のキーはどうなると思いますか?

<?php
$a = [3.14 => 3.14];
var_dump($a);

結果は次のようになります。

array(1) {
  [3] =>
  double(3.14)
}

キーとして渡した浮動小数点数が整数にキャストされています。このことはPHPマニュアルにも書いてあります。

key は、整数 または 文字列です。 value には任意の型を指定できます。
さらに、次のような key のキャストが発生します。

  • 10 進数の integer として妥当な形式の String は、 数値の前に + 記号がついていない限り、 integer 型にキャストされます。 つまり、キーに "8" を指定すると、実際には 8 として格納されるということです。一方 "08" はキャストされません。これは十進数として妥当な形式ではないからです。
  • floats もまた integer にキャストされます。つまり、 小数部分は切り捨てられるということです。たとえばキーに 8.7 を指定すると、実際には 8 として格納されます。
  • (以下略)

http://php.net/manual/ja/language.types.array.php

なるほど、マニュアル通りの挙動というわけです。

ところで、PHPを昔から使っているユーザーの中には「こんな記述、昔からあったっけ?」と思う方もいるのではないでしょうか。

そこで、Internet ArchiveでPHPマニュアルの過去の記述を調べてみたところ、上記の記述は2012年5月頃に追加されたということがわかりました。下記は2012年4月時点の記述です。

Floats in key are truncated to integer.

http://web.archive.org/web/20120204193433/http://us3.php.net/manual/en/language.types.array.php

不親切ではあるけど、以前から明文化されていたようですね。「こんな記述、昔からあったっけ?」に対する回答は「昔からありましたよ」になります。

こんな基本的な内容に関する記述も見直されてるんだなーというのが意外に感じられたので記事にしてみました。