[PHP]簡易比較でおちいりやすい罠_その3

Read More



簡易比較でおちいりやすい罠、パート3。
前回の記事からだいぶ間があいてるね。


以前の記事:[PHP]簡易比較でおちいりやすい罠
http://xirasaya.com/?m=detail&hid=266

以前の記事:[PHP]簡易比較でおちいりやすい罠_その2
http://xirasaya.com/?m=detail&hid=289


--
一つ例を出すので考えてみてほしい。


以下のような処理を実行した場合、画面に表示されるのは1か0か?

■例1
<?php
$var='';
if(in_array($var, array(0,1,2)))
{
  echo 1;
}
else
{
  echo 0;
}
?>


in_array()は第一引数の値が第二引数の配列の値に一致するものがあるかを調べて、
一致する値があった場合はtrueを返すというもの。

上記の例の場合、$varには初期値として""(空文字)が指定されている。
配列の中に空の値は無いので一致するものはない。
ゆえに 0が表示される、と考えてしまうかもしれない。





が、実行結果は以下の通り。

■例1の実行結果
> 1



理由は前回書いたものと同じなので省略。

以前の記事:[PHP]簡易比較でおちいりやすい罠
http://xirasaya.com/?m=detail&hid=266



--
ちなみにこれを回避したいならば以下のようにするとよい。
<?php
$var='';
if(in_array($var, array(0,1,2), true))
{
  echo 1;
}
else
{
  echo 0;
}
?>


in_array()の第3引数trueを指定する。
こうすることでstrict、厳密に、つまり型の比較までを行ってくれるようになる。


ただしこうすると今度は$var='1'と$var=1で結果が違ってくるのでこれまた注意が必要となる。



--
■おまけ
以下の実行結果は何が返ってくるでしょうか。

<?php
$var='test';
if(in_array($var, array(0)))
{
  echo 1;
}
else
{
  echo 0;
}
?>














答えは↓に


























答え: 1

当たったかな?



in_array()の問題を解決する方法を考えてみた
■[PHP]型に左右されないin_array()を考える
http://xirasaya.com/?m=detail&hid=524







--
そのほかの関係する記事
■[PHP]簡易比較でおちいりやすい罠
http://xirasaya.com/?m=detail&hid=266


■[PHP]簡易比較でおちいりやすい罠_その2
http://xirasaya.com/?m=detail&hid=289







Comments(2)

1  みやび  2016/10/01 (土) 03:03 ID:hdNggVo15
<?= "yes" == 0 ? "true" : "false" ?>
これがtrueになる奴と同じ問題ですね。
型変換すると左から数値探すから、一番左が数値以外だと0扱いになってしまうっていう…

2  シラサヤ  2016/10/04 (火) 14:49 ID:RDhez1H15
簡易比較(==)は気を付けてる人多いと思うけど、in_array()は案外少ないんじゃないかなと思った