PHP

【PHP / 配列】in_arrayと、気を付けたい落とし穴 ~第3引数に要注意~

1.in_array()について


in_arrayは、配列に値があるかどうかチェックします。

PHPマニュアルを見てみると、
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool
と書いています。



どういう意味??

PHP 配列 in_arrayまとめ | idol-plus Webデザイン・職業訓練校・プログラミングまとめブログ by YUKI WORKS -独学・未経験・看護師からWebデザイナーとフロントエンドエンジニアに。-

in_array ( 探したい文字 , 検索の対象となる配列 , [省略可能。 * 初期設定ではfalseになっている]) : 結果をtrueかfalseで返す。


  • needle:探す値
  • haystack:配列
  • strict:初期は「false」に設定されています。trueに設定されると、in_array() は、haystack(配列)内の、needle(探したい値)の型も確認してくれます。
  • bool:ブール。boolean(ブーリアン)とも言います。boolは、真偽の値を表します。 マニュアルにboolと書かれていたら、「true」または「false」のどちらかが返ってくると考えます。
  •   



2.気を付けたい落とし穴


文字列と文字列の比較

以下は、配列 $sakurazaka46の中に、探したい値「菅井」、「平手」が入っているかどうかを確認しています。

※ var_dumpで結果を表示させることができます。



「菅井」は含まれているのでtrue、「平手」は含まれていないので「false」が返ってきました。





文字列と数値の比較

次は名前ではなく、0~10までの数字が入っています。



一つ目の「5」は配列の中に含まれる数字なので「true」になっています。

しかし、
$sakurazaka46の配列に「平手」という文字列がないのに「true」が返ってきました。




どういうこと???

その理由は「比較演算子」にあります。



PHPマニュアルにある
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
をもう一度見てみます。

省略可能である
[, bool $strict = FALSE]
にヒントがあります。


第3引数のstrictはデフォルトで「false」になっているため、「型」の比較までをしていません。

「文字列」と「数値」を比較する際、
厳密な「===」での比較ではなく、ゆるい「==」で比較しています。




===ではなく、==で比較とは?

比較演算子の中には、===(厳密等価演算子)と、==(等価演算子)があります。


簡単に説明すると、
===では「値」が正しく、かつ同じ「型」かどうか判断します。


しかし、==の場合は、「型」の相互変換をした後に、それぞれの「値」が正しいかどうかを判断しています。

さらに言うと、
==を使って「文字列」と「数値」を比較すると、「文字列」は自動的に型変換(キャスト)されてしまいます。


たとえば、
「7人」という風に数字と文字列が一緒になっている場合は、7人→「7」に変換されてしまいます。



今回は「平手」という文字列。

先頭が数値ではない、あるいは文字列に数値が含まれていないときは「0」に変換されてしまいます。





このような理由により、

in_array(‘平手’, $sakura46)の、文字列「平手」は数値の「0」に。
その結果、「0」は配列(0~10の数値)の中に入っていると判断され、「true」が返されるという仕組みです。

==(等価演算子)は、文字列と数値の比較をする際には注意が必要です。





等価演算子をもっと詳しく

===と==についての詳しい説明はこちらです

【PHP / JavaScript】==演算子と===演算子の違い ~等価演算子と厳密等価演算子~【やんわりメモ】 職業訓練校のPHPの授業内で、==演算子と===演算子が出てきました。 同じ式で、似たような記号なのに違う結果。 /...


3.解決策


in_array使うときは、第三引数に「true」を指定することが望ましいです。
特に文字列と数値を比較する可能性がある場合。

でも授業で使っているテキストのサンプルコードは、第3引数を設定していないものがほとんどだったので、場合によって使い分けられるようになりたいと思いました。



4.参考サイト


▽ in_array / PHPマニュアル


▽ 比較演算子 / PHPマニュアル


▽ in_arrayを使うときは黙って第三引数を付けること


▽ 【PHP】in_arrayの第三引数をtrueに設定するべき理由