PHP使っている人ならわかると思うけど、
ポイントは以下の通り
数値型と同じ型にキャストされる
数値型へキャストされる
http://techblog.ecstudio.jp/tech-tips/php-string-compare.html
それを踏まえた上でこっちが本題なのだが
in_arrayは第三引数で「===」を使用するかどうか指定できるが
array_key_existsではそのような指定はない。
ちょっとどうなっているのか気になったので
挙動を確認してみた。
下記にソースがあるが、動かして見たところ
単純な「==」を使っているわけでも
「===」を使っているわけでもないらしいということがわかった。
in_arrayとは違ってもう少し厳密な処理をやっているみたい。
------------------------------------------------------------
if (1 === '1') {
echo "true";
} else {
//こっちに分岐
//厳密な型比較では違う
echo "false";
}
if ('a' == 0) {
//こっちに分岐
// 'a'が数値型にキャストされて0になる
echo "true";
} else {
echo "false";
}
if ('5e0' == '5') {
//こっちに分岐
//両方とも文字列型だが、両方とも数値形式の場合はPHPは何故か数値型へキャストする
echo "true";
} else {
echo "false";
}
$ArrTest = array(
1 => ''
, 'a' => ''
, '5e0' => ''
);
if (array_key_exists('1', $ArrTest) == true) {
//こっちに分岐
//array_key_exists内では単純に「===」を使っているわけではないらしい
echo "true";
} else {
echo "false";
}
if (array_key_exists(0, $ArrTest) == true) {
echo "true";
} else {
//こっちに分岐
//array_key_exists内では単純に「==」を使っているわけではないらしい
echo "false";
}
if (array_key_exists('5', $ArrTest) == true) {
echo "true";
} else {
//こっちに分岐
//array_key_exists内では単純に「==」を使っているわけではないらしい
echo "false";
}
exit;
array の keyexistは 数値ではなく 文字にキャストされているのでは? 0を文字にキャストすると"0"だろ
コメントありがとうございます。元増田です。 一瞬そうかと思ったのですが、 stringにキャストしてから比較してるわけではないようです。 http://anond.hatelabo.jp/20130123190650 -------------------...
✕ //そのまま比較しているわけでもstringに比較しているわけでもないらしい ○ //そのまま比較しているわけでもstringにキャストしているわけでもないらしい