# php -r '$a=array("1"=>1);var_dump($a[1]);'
int(1)
まあこれはPHP配列の基本ですね。普通ならアレっと思うところですが。
# php -r '$a=array("1a"=>1);var_dump($a);'
array(1) {
["1a"]=>
int(1)
}
数字から始まるインデックスでも、勝手に整数型へキャストされるわけではない。
# php -r '$a=array("0x1a"=>1);var_dump($a);'
array(1) {
["0x1a"]=>
int(1)
}
数値リテラルでも文字列になってたら文字列。(当たり前)
# php -r '$a=array(0x1a=>1);var_dump($a);'
array(1) {
[26]=>
int(1)
}
ちゃんとした数値リテラルなら数値インデックス。(これも当たり前)
# php -r '$a=array(""=>1);var_dump($a);'
array(1) {
[""]=>
int(1)
}
空文字列のインデックスもアリ。0ではないので注意。
# php -r '$a=array(false=>1);var_dump($a);'
array(1) {
[0]=>
int(1)
}
ブール型は整数型にキャストされる(知らなかった!)
# php -r '$a=array(true=>1);var_dump($a);'
array(1) {
[1]=>
int(1)
}
同上
# php -r '$a=array(1.1=>1);var_dump($a);'
array(1) {
[1]=>
int(1)
}
おっと、浮動小数点型は整数型にキャストされるのか!
# php -r '$a=array("1.1"=>1);var_dump($a);'
array(1) {
["1.1"]=>
int(1)
}
おっと、こっちは文字列インデックスのまま。整数との違いでハマルかも
# php -r '$a=array("01"=>1);var_dump($a);'
array(1) {
["01"]=>
int(1)
}
ありゃりゃ。これは危険だぞ。DBからZEROFILLしたフィールドの結果を、intval()かけずにインデックスに格納したらハマリそう
# php -r '$a=array(-1=>1);var_dump($a);'
array(1) {
[-1]=>
int(1)
}
うん、まあ。これは当然。
# php -r '$a=array("-1"=>1);var_dump($a);'
array(1) {
[-1]=>
int(1)
}
ああ、こっちは整数として認識するんだあ。0は駄目。小数点も駄目。マイナスだけOKか。
# php -r '$a=array("+1"=>1);var_dump($a);'
array(1) {
["+1"]=>
int(1)
}
-はOKだけど、+は駄目でした。
いやあ、知らないことが結構いっぱいありましたね。
配列インデックスはなるべく型を揃えて指定しましょう。(当たり前)
実際の所、配列インデックスが整数型か文字列型かで、+演算子とかarray_merge()の挙動が全然違うので、それを意識しておかないと確実にハマリますね。
というわけで、昨日のパッチも本当は良くない。intval()かけておかないと、結構怖いかも。
midフィールドにzerofill属性ついてたらアウトじゃないかなあ。
$_cachedModule_mid[intval($module->getVar('mid'))] =& $module;