連想配列のキーに渡したときの暗黙のキャスト

http://d.hatena.ne.jp/hnw/20080222 のネタですが、以前 hnw さんが調べた (http://d.hatena.ne.jp/hnw/20070521) とおっしゃっていたところにはあのときの主張は書いてないみたい。ということで短いネタですが書いておきます。

<?php
$a = array();
$a['0'] = 'aho';
$a['1'] = 'baka';
$a['00'] = 'cine';
var_dump($a);
?>

の出力が以下のようになります。

array(3) {
  [0]=>
  string(3) "aho"
  [1]=>
  string(4) "baka"
  ["00"]=>
  string(4) "cine"
}

注目すべきは、3つ目の要素のキーが string(2) "00" になっていること!!

フォームから送られてくる数値(のように見える文字列)とか、データベースでCHARで格納してるけど運用上数値しか入れてないのものなど、「配列のキーに入れればintになってくれるでしょ」と思い込んでるとちょっとハマるので注意しましょう、ということでした。

なんで? ってのは、zend_hash.c (php4) or zend_hash.h (php5) の #define HANDLE_NUMERIC(key, length, func) あたりを読んでみてください。