はじめに
PHP の strpos() は文字列検索でよく使われる関数ですが、戻り値の判定方法を間違えると 「見つかったのに見つからなかったと誤判定」 という落とし穴にはまります。PHP8上級試験でも頻出のポイントなので整理しておきましょう。
目次
strpos() の仕様
strpos(string $haystack, string $needle, int $offset = 0): int|false- 部分文字列が 見つかった → 先頭からの位置(0以上の int)が返る
- 部分文字列が 見つからなかった →
falseが返る
つまり 0 は「検索対象が先頭にある」という意味を持ちます。
よくある間違いの例
<?php
declare(strict_types=1);
error_reporting(-1);
$haystack = 'abcdefg';
$r = strpos($haystack, 'a'); // 先頭なので 0 を返す
var_dump($r);
if ($r == false) {
echo "検索対象の文字は見つかりませんでした\n";
} else {
echo "検索対象の文字は見つかりました\n";
}実行結果
int(0)
検索対象の文字は見つかりませんでしたint(0)は「先頭で見つかった」ことを意味する- しかし
0 == falseは true になるため、誤って「見つからなかった」と表示される
正しい書き方:厳密比較を使う
if ($r === false) {
echo "検索対象の文字は見つかりませんでした\n";
} else {
echo "検索対象の文字は見つかりました\n";
}このように === false を使えば
- 本当に見つからなかったときだけ
true - 先頭で見つかった場合(0が返る)は「見つかった」と判定される
試験対策のポイント
strpos()の戻り値は int|false0とfalseは別物 → 緩い比較(==)では混同される- 必ず 厳密比較(=== false) で判定すること
まとめ
strpos()は「見つかった位置(int)」か「見つからなければ false」を返す- 0 が返ってきた場合は「先頭で見つかった」
- 判定には必ず
=== falseを使うのが鉄則
👉 この落とし穴は array_search() や mb_strpos() などでも同じように出てくるので要注意です。
