array_searchが存在する値を存在しないとか言い出した

久々にPHPさんにやられたのでちゃんと備忘録書きます。
まずは今回ハマった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番目に存在します"
問題が起こったのは、これを利用したif文。以下のようなコード。
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("ありません!");
}
// 実行結果: "ありません!"
ありません!!?いや0番目に存在してるでしょ勘弁してよ…
これはバグでしょ…と思ったけどこちら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
(100 == "1e2")が本気でワケワカメだったけど、
eを指数表記と判定して「1*10の2乗、つまり100だからTRUE!」っていう考えらしい。
しかもこれがPHP公式に書いてある恐怖。

みんな、ちゃんとリファレンス読もうな!!
PHP: 比較演算子 - Manual