CONTENTS
1.in_array()について
in_arrayは、配列に値があるかどうかチェックします。
PHPマニュアルを見てみると、
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool
と書いています。
どういう意味??

in_array ( 探したい文字 , 検索の対象となる配列 , [省略可能。 * 初期設定ではfalseになっている]) : 結果をtrueかfalseで返す。
- needle:探す値
- haystack:配列
- strict:初期は「false」に設定されています。trueに設定されると、in_array() は、haystack(配列)内の、needle(探したい値)の型も確認してくれます。
- bool:ブール。boolean(ブーリアン)とも言います。boolは、真偽の値を表します。 マニュアルにboolと書かれていたら、「true」または「false」のどちらかが返ってくると考えます。
2.気を付けたい落とし穴
文字列と文字列の比較
以下は、配列 $sakurazaka46の中に、探したい値「菅井」、「平手」が入っているかどうかを確認しています。
※ var_dumpで結果を表示させることができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $sakurazaka46 = ['菅井', '守屋', '渡邊', '小林', '森田', '田村']; var_dump(in_array('菅井', $sakurazaka46)); // 配列に「菅井」が含まれるので、trueを返すと考えられる echo "<br><br>"; var_dump(in_array('平手', $sakurazaka46)); // 配列に「平手」がないので、falseを返すと考えられる ?> |
1 2 3 4 5 |
//出力結果 bool(true) bool(false) |
「菅井」は含まれているのでtrue、「平手」は含まれていないので「false」が返ってきました。
文字列と数値の比較
次は名前ではなく、0~10までの数字が入っています。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $sakurazaka46 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var_dump(in_array(5, $sakura46)); // 「5」という数値があるので、trueを返す? var_dump(in_array('平手', $sakura46)); // 配列内に「平手」という文字列がないので、falseになる? ?> |
1 2 3 4 5 |
//出力結果 bool(true) bool(true) |
一つ目の「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」が返されるという仕組みです。
==(等価演算子)は、文字列と数値の比較をする際には注意が必要です。
等価演算子をもっと詳しく
===と==についての詳しい説明はこちらです

3.解決策
in_array使うときは、第三引数に「true」を指定することが望ましいです。
特に文字列と数値を比較する可能性がある場合。
でも授業で使っているテキストのサンプルコードは、第3引数を設定していないものがほとんどだったので、場合によって使い分けられるようになりたいと思いました。
4.参考サイト
▽ in_array / PHPマニュアル
▽ 比較演算子 / PHPマニュアル
▽ in_arrayを使うときは黙って第三引数を付けること
▽ 【PHP】in_arrayの第三引数をtrueに設定するべき理由