- カテゴリ: 配列操作(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)
引数
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
$needle | mixed | 必須 | — | 検索したい値。文字列・数値・配列・オブジェクトなど任意の型を指定可能 |
$haystack | array | 必須 | — | 検索対象の配列 |
$strict | bool | 任意 | false | trueにすると型まで含めて===相当の厳密比較を行う |
- 戻り値:
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'は文字列として格納されているため、$strictをtrueにすると数値の3とは型が異なると判定され、結果はfalseになります。型の取り違えによる不具合を避けたい場合は、基本的に$strict = trueを明示することをおすすめします。
多次元配列を検索する
in_arrayは1階層目の要素だけを対象に比較するため、連想配列を要素に持つ多次元配列にそのまま使っても意図した結果は得られません。特定のキーの値だけを検索したい場合は、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_array | bool | 値が配列に存在するかだけを知りたいとき。最も基本的な選択肢 |
| array_search | キー または false | 存在するかに加えて、そのキー(インデックス)も欲しいとき |
array_key_exists | bool | 値ではなくキーが存在するかを調べたいとき |
isset(array_flip($arr)[$v]) | bool | 同じ配列に対して繰り返し検索する場合の高速化 |
| Laravel Collection::contains | bool | Laravelのコレクションを扱っていて、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を使うと簡潔に書けます。
関連記事
- contains — コレクションに値/条件が含まれるか判定する
- whereIn — 指定キーの値が配列に含まれる要素だけを抽出
- intersect — コレクション同士の共通要素を取り出す
- PHP 連想配列の使い方|作成・取得・追加・削除からforeach・関数まで
参考リンク
- PHP公式マニュアル「in_array」:https://www.php.net/manual/ja/function.in-array.php
- PHP公式マニュアル「array_search」:https://www.php.net/manual/ja/function.array-search.php
- PHP公式マニュアル「array_column」:https://www.php.net/manual/ja/function.array-column.php
- 本サイト内:array_search — 配列から値を検索してキーを取得する使い方
https://laravelwren.com/2026/08/01/array_search/

コメント