はじめに
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()
などでも同じように出てくるので要注意です。