0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔰【PHP 開発ガイド】array_search の戻り値を if 文で 判定する際の注意点

Last updated at Posted at 2025-05-10

環境:PHP 8.4.5

PHP の array_search 関数 は、検索対象の値が 見つからなかった場合false を返します。一方で 見つかった場合 は、その要素のインデックス(整数)を返します。

ここで厄介なのが、インデックス 0 が返ってきたときです。PHP では数値の 0 はブール値に変換すると false と同等とみなされ、処理の結果が期待通りにならないので注意が必要です。

$idx = array_search($needle, $haystack);

if ($idx) {
    // インデックスが見つかったと思って処理を続行
}

インデックス 0 が返ってくると $idxfalse と評価され、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 以上の整数」という仕様があれば同じ注意が必要。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?