環境:PHP 8.4.5
PHP の array_search 関数 は、検索対象の値が 見つからなかった場合 に false
を返します。一方で 見つかった場合 は、その要素のインデックス(整数)を返します。
ここで厄介なのが、インデックス 0
が返ってきたときです。PHP では数値の 0
はブール値に変換すると false
と同等とみなされ、処理の結果が期待通りにならないので注意が必要です。
$idx = array_search($needle, $haystack);
if ($idx) {
// インデックスが見つかったと思って処理を続行
}
インデックス 0
が返ってくると $idx
は false
と評価され、if
の中が実行されません。その結果「見つかったのに見つからなかった」という挙動になってしまいます。
安全な判定方法
array_search()
が返す false
は型そのものが false です。インデックス 0 などの整数値とは型が異なるため、===
または !==
で 厳密比較 を行うことで判定ミスを防げます。
$idx = array_search($needle, $haystack);
if ($idx !== false) {
// インデックス 0 も含めて正常に判定できる
}
サンプル: Two Sum 問題でのバグ修正例
function twoSum($target, $nums) {
$pair = [];
foreach ($nums as $k => $v) {
$vv = $target - $v;
$kk = array_search($vv, $pair);
if ($kk !== false) { // <-- 修正ポイント
return [$kk, $k];
}
$pair[$k] = $v;
}
}
修正版では if ($kk !== false)
と厳密比較しているため、インデックス 0
が返っても正しく判定し、期待通りの結果が得られます。
まとめ
-
array_search()
の返り値0
はブール評価でfalse
と等価になる。 - 見つかったかどうかを判定する際は
!== false
(または=== false
)で 厳密比較 を行う。 - 他の関数でも「見つからなかったら
false
、見つかったら 0 以上の整数」という仕様があれば同じ注意が必要。