PEAK XOOPS - 配列インデックスの覚え書き in englishin japanese

Archive | RSS |
PHP
PHP : 配列インデックスの覚え書き
Poster : GIJOE on 2007-03-07 05:28:47 (9631 reads)


# 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;

0 comments

Related articles
Printer friendly page Send this story to a friend

Comments list

Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!