まずは今回ハマったarray_search関数について。
array_searchとは
array_search(検索したいキーワード, 検索リスト)
という風に書くと最初に検索ワードが見つかった位置を返す関数です。
見つからなかったらfalseを返します。こんなかんじ。
1 2 3 4 5 6 7 8 | $list = array ( "D" , "V" , "D" , "!" ); $key = "D" ; var_dump( array_search ( $key , $list ) . "番目に存在します" ); // 実行結果: "0番目に存在します" $key = "!" ; var_dump( array_search ( $key , $list ) . "番目に存在します" ); // 実行結果: "3番目に存在します" |
1 2 3 4 5 6 7 8 9 | $list = array ( "D" , "V" , "D" , "!" ); $key = "D" ; if ( array_search ( $key , $list )) { var_dump( "あります!" ); } else { var_dump( "ありません!" ); } // 実行結果: "ありません!" |
これはバグでしょ…と思ったけどこちらPHPの仕様です。
PHP先生は0をfalse扱いするの忘れてました。ヒィィィィ~
解決策は、以下のようにfalseか否か厳密に判定すること。
1 2 3 4 5 6 | if ( array_search ( $key , $list ) !== FALSE) { var_dump( "あります!" ); } else { var_dump( "ありません!" ); } // 実行結果: "あります!" |
あとは毎回忘れるPHPさんの型に囚われないビックリ判定仕様を書いておきます。
1 2 3 4 5 6 7 8 9 10 11 12 | var_dump(null == '' ); // TRUE var_dump( '' == 0); // TRUE var_dump(0 == false); // TRUE var_dump(100 == "100" ); // TRUE var_dump( "100" == "100.0" ); // TRUE var_dump( "1192作ろう" == 1192); // TRUE var_dump( "作ろう1192" == 1192); // FALSE var_dump(100 == "1e2" ); // TRUE var_dump(100 == "1a2" ); // FALSE |
eを指数表記と判定して「1*10の2乗、つまり100だからTRUE!」っていう考えらしい。
しかもこれがPHP公式に書いてある恐怖。
みんな、ちゃんとリファレンス読もうな!!
PHP: 比較演算子 - Manual