《PHP8上級試験対策》strpos()の戻り値とfalse判定の落とし穴

  • URLをコピーしました!

はじめに

PHP の strpos() は文字列検索でよく使われる関数ですが、戻り値の判定方法を間違えると 「見つかったのに見つからなかったと誤判定」 という落とし穴にはまります。PHP8上級試験でも頻出のポイントなので整理しておきましょう。

キーワード: strpos / false / 厳密比較 / == と === /

目次

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|false
  • 0false は別物 → 緩い比較(==)では混同される
  • 必ず 厳密比較(=== false) で判定すること

まとめ

  • strpos() は「見つかった位置(int)」か「見つからなければ false」を返す
  • 0 が返ってきた場合は「先頭で見つかった」
  • 判定には必ず === false を使うのが鉄則

👉 この落とし穴は array_search()mb_strpos() などでも同じように出てくるので要注意です。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次