PHP in_array関数の使い方完全ガイド: 配列内の要素検索を極めよう!

基本文法・構文ガイド
  • カテゴリ: 配列操作(PHP標準関数)
  • 対象バージョン: PHP 7.4 〜 8.4(比較挙動の差はPHP 8.0が境目)
  • シグネチャ: in_array(mixed $needle, array $haystack, bool $strict = false): bool
  • 関連: array_search / array_key_exists / isset(array_flip()) / Laravel Collection::contains
  • 変更履歴: PHP 8.0で数値文字列の比較ルールが変更され、$strict = false時の一致結果に影響

要点(TL;DR)

  • 配列$haystackの中に値$needleが存在するかをboolで返す関数
  • 最低限: in_array('banana', $fruits)/型まで厳密に比較したいときは第三引数にtrueを渡す
  • 罠: 既定は「ゆるい比較」/多次元配列はそのままでは検索できない/要素数が多い場合はarray_flip+issetの方が速い

概要

in_arrayは、配列$haystackの中に値$needleが含まれているかどうかを判定するPHPの標準関数です。「配列にこの値が入っているか確認したい」という最も基本的な処理を1行で書けるため、フォーム入力のバリデーションや許可リストとの照合、データのフィルタリングなど幅広い場面で使われます。既定では==相当のゆるい比較を行うため、型が異なる値同士でも一致してしまう場合がある点には注意が必要です。

構文 / シグネチャ

bool in_array(mixed $needle, array $haystack, bool $strict = false)

引数

引数必須既定値説明
$needlemixed必須検索したい値。文字列・数値・配列・オブジェクトなど任意の型を指定可能
$haystackarray必須検索対象の配列
$strictbool任意falsetrueにすると型まで含めて===相当の厳密比較を行う
  • 戻り値bool(見つかればtrue、見つからなければfalse
  • 例外/副作用:例外は発生しない/$haystackは変更されない(非破壊)

使用例

基本の使い方

<?php

$fruits = ['apple', 'banana', 'orange'];

if (in_array('banana', $fruits)) {
    echo 'バナナはリストに存在します。';
} else {
    echo 'バナナはリストに存在しません。';
}
// 出力: バナナはリストに存在します。

厳密な型チェック(第三引数 $strict

<?php

$numbers = [1, 2, '3', 4];

var_dump(in_array(3, $numbers));       // true(ゆるい比較。'3' と 3 が一致)
var_dump(in_array(3, $numbers, true)); // false(厳密比較。型まで見て不一致)

配列内の'3'は文字列として格納されているため、$stricttrueにすると数値の3とは型が異なると判定され、結果はfalseになります。型の取り違えによる不具合を避けたい場合は、基本的に$strict = trueを明示することをおすすめします。

多次元配列を検索する

in_array1階層目の要素だけを対象に比較するため、連想配列を要素に持つ多次元配列にそのまま使っても意図した結果は得られません。特定のキーの値だけを検索したい場合は、array_columnで値の列を取り出してから使います。

<?php

$users = [
    ['id' => 1, 'name' => 'Taro'],
    ['id' => 2, 'name' => 'Hanako'],
    ['id' => 3, 'name' => 'Jiro'],
];

// id=2 のユーザーが含まれるか調べたい場合
$ids = array_column($users, 'id');

if (in_array(2, $ids, true)) {
    echo 'id=2のユーザーが存在します。';
}

配列のフィルタリングに使う

<?php

$all_data = ['apple', 'banana', 'grape', 'pear'];
$filter = ['banana', 'pear'];

$filtered_data = array_filter($all_data, function ($item) use ($filter) {
    return in_array($item, $filter, true);
});

print_r($filtered_data);
// 出力: ['banana', 'pear'](キーは保持される)

ユーザー入力の検証(許可リスト照合)

<?php

$allowed_values = ['yes', 'no', 'maybe'];
$user_input = $_POST['answer'] ?? '';

if (in_array($user_input, $allowed_values, true)) {
    echo '入力は許可されています。';
} else {
    echo '許可されていない値です。';
}

外部から受け取った値を検証する場合は、想定外の型が紛れ込む可能性があるため$strict = trueを指定し、型まで一致するものだけを許可するのが安全です。

大量データでのパフォーマンス最適化

in_arrayは先頭から順に比較する線形探索(計算量O(n))です。同じ配列に対して何度も検索を行う場合は、array_flipで値をキーに変換しissetで判定すると、平均的にO(1)で済み高速です(ただし値が重複していると後の値で上書きされる点、値がスカラーである必要がある点に注意)。

<?php

$values = range(1, 1000000);
$search_value = 999999;

// 事前に1回だけ変換しておく
$flipped_values = array_flip($values);

if (isset($flipped_values[$search_value])) {
    echo "{$search_value} は配列に存在します。";
}

よくある落とし穴・注意

  • 既定はゆるい比較$strictを省略すると==相当の比較になり、0'abc'のような型の異なる値同士が意図せず一致することがあります。特にPHP 8.0より前は数値と非数値文字列の比較ルールが現在と異なるため、バージョンによって結果が変わる場合があります。迷ったら$strict = trueを使いましょう。
  • 多次元配列はそのまま検索できないin_arrayは1階層目の要素しか比較しません。連想配列を要素に持つ配列から特定キーの値を探すには、array_columnで値を抽出するか、array_searchやループで対応します。
  • キーではなく値の存在確認:連想配列でキーの存在を確認したい場合はin_arrayではなくarray_key_existsを使います。混同すると意図と異なる判定になります。
  • 大規模配列での繰り返し検索は遅い:ループの中で同じ配列に対して何度もin_arrayを呼ぶと、要素数×呼び出し回数分の比較が発生します。事前にarray_flipしてキー化するか、そもそも検索対象を連想配列で持つ設計に変えることを検討してください。

代替・関連APIとの比較

関数/メソッド戻り値用途
in_arraybool値が配列に存在するかだけを知りたいとき。最も基本的な選択肢
array_searchキー または false存在するかに加えて、そのキー(インデックス)も欲しいとき
array_key_existsbool値ではなくキーが存在するかを調べたいとき
isset(array_flip($arr)[$v])bool同じ配列に対して繰り返し検索する場合の高速化
Laravel Collection::containsboolLaravelのコレクションを扱っていて、key=value形式や演算子・コールバックでの判定も行いたいとき

トラブルシュート(症状別)

症状原因対処
型が違うのにtrueになる既定のゆるい比較(==)で型変換が起きている第三引数にtrueを渡し厳密比較にする
多次元配列で常にfalseになるin_arrayが1階層目しか見ていないarray_columnで値を抽出してから検索する
大量データでレスポンスが遅いループ内でin_arrayを繰り返し呼び出しO(n×m)になっているarray_flip+issetに置き換える、またはDB側で絞り込む

よくある質問(FAQ)

Q. in_arrayとarray_searchはどちらを使えばいいですか?

A. 「存在するかどうか」だけが知りたいなら可読性の高いin_array、「存在すればそのキー(インデックス)も欲しい」場合はarray_searchを使います。array_searchはキーが0の場合に戻り値がfalseと紛らわしくなるため、比較には===を使う必要がある点に注意してください。

Q. 多次元配列(連想配列の配列)から特定の値を検索するにはどうすればいいですか?

A. array_column($array, 'キー名')で対象キーの値だけを1次元配列として取り出し、その結果に対してin_arrayを使います。前述の「多次元配列を検索する」の例を参照してください。

Q. Laravelのプロジェクトでも素のin_arrayを使っていいですか?

A. 単純な配列(スカラー値の配列)に対する存在確認であればin_arrayで十分です。取得結果がすでにCollectionの場合や、key=value形式・演算子・コールバックでの判定が必要な場合はCollection::containsを使うと簡潔に書けます。

関連記事

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント