1. ホーム
  2. PHP

【PHP】in_array・array_search・array_keys で配列を検索する方法

Share

PHP で配列を扱っていると、「この値は配列の中にあるか?」「あるとしたら何番目か?」を調べたい場面が頻繁に出てきます。こうした検索には in_array()array_search()array_keys() という 3 つの関数が便利です。この記事では、それぞれの違いと使い分けを、初心者の方にも分かるように具体例で解説します。

3つの関数の役割の違い

まずは全体像をつかみましょう。3 つの関数は「配列の中の値を探す」点では共通していますが、返ってくるものが異なります。

関数調べること戻り値
in_array()値が含まれているかtrue / false
array_search()値が最初に見つかった位置そのキー(無ければ false
array_keys()値が見つかったすべての位置キーの配列

「あるか無いかだけ知りたい」なら in_array()、「どこにあるか 1 つ知りたい」なら array_search()、「同じ値が複数あって全部の位置を知りたい」なら array_keys()、と覚えると整理しやすくなります。

in_array() で値の有無を調べる

in_array() は、指定した値が配列に含まれていれば true、含まれていなければ false を返します。第 1 引数に探す値、第 2 引数に配列を渡します。

in_array.php
<?php
$fruits = ['りんご', 'みかん', 'ぶどう'];

if (in_array('みかん', $fruits)) {
    echo 'みかんはあります';
} else {
    echo 'みかんはありません';
}
// → みかんはあります

条件分岐の if と組み合わせて「リストに含まれているか」を判定する、という使い方が定番です。

型まで厳密に比較する第3引数

in_array() は標準では値が一致するかだけを見て、データ型(文字列か数値か)の違いは無視します。そのため、文字列の "0" と数値の 0 が同じとみなされるなど、意図しない一致が起きることがあります。型まで含めて厳密に比較したいときは、第 3 引数に true を渡します。

strict.php
<?php
$list = ['1', '2', '3']; // 文字列の配列

// 型を無視するため、数値の 1 でも一致してしまう
var_dump(in_array(1, $list));        // bool(true)

// 第3引数 true で型も厳密に比較する
var_dump(in_array(1, $list, true));  // bool(false)

フォームから受け取った値などは型が文字列になっていることが多いため、誤判定を避けたいときは厳密比較を意識しておくと安全です。

array_search() で位置(キー)を調べる

array_search() は、値が見つかったときにそのキー(位置)を返します。見つからなければ false を返します。引数の順番は in_array() と同じで、探す値・配列・(必要なら)厳密比較の順です。

array_search.php
<?php
$fruits = ['りんご', 'みかん', 'ぶどう'];

$key = array_search('ぶどう', $fruits);
echo $key; // 2(0から数えて3番目)

// 連想配列ならキー名が返る
$prices = ['apple' => 150, 'orange' => 100, 'grape' => 300];
echo array_search(100, $prices); // orange

見つからないときの判定は === で行う

注意したいのは、見つかった位置が先頭(キーが 0)だったときです。0 は条件式の中で false と同じように扱われるため、if ($key) のように書くと「見つかったのに見つからなかった」と誤判定してしまいます。見つからなかったことを正しく判定するには、型まで比較する === を使って false かどうかを確かめます。

check.php
<?php
$fruits = ['りんご', 'みかん', 'ぶどう'];
$key = array_search('りんご', $fruits); // 0 が返る

// NG: 0 は false 扱いされ「見つからない」と判定されてしまう
if ($key) {
    echo '見つかった';
}

// OK: === false で厳密に判定する
if ($key !== false) {
    echo "見つかった(位置: {$key})"; // 見つかった(位置: 0)
}

array_keys() ですべての位置を調べる

array_search() は最初に見つかった 1 つしか返しません。同じ値が複数あってすべての位置を知りたいときは array_keys() を使います。第 2 引数に値を指定すると、その値を持つキーをすべて配列で返します。

array_keys.php
<?php
$votes = ['A', 'B', 'A', 'C', 'A'];

// 値 'A' を持つキーをすべて取得
$keys = array_keys($votes, 'A');
print_r($keys);
// Array ( [0] => 0 [1] => 2 [2] => 4 )

// 第2引数を省略すると、すべてのキーを取得できる
print_r(array_keys($votes));
// Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 )

第 2 引数を省略すれば、配列に含まれるすべてのキーを取り出せます。連想配列のキー一覧がほしいときにも役立ちます。

実践例:選択された値が許可リストにあるか確認する

これらの関数は、フォームから送られた値が「あらかじめ用意した選択肢の中にあるか」を検証する場面でよく使います。想定外の値が送られてきたときに弾く、シンプルなバリデーションです。

validate.php
<?php
// 許可する都道府県(選択肢)
$allowed = ['東京都', '大阪府', '愛知県'];

$input = $_POST['pref'] ?? '';

// 厳密比較で許可リストに含まれているか確認
if (in_array($input, $allowed, true)) {
    echo "{$input} を受け付けました";
} else {
    echo '不正な値です';
}

まとめ

3 つの配列検索関数は、調べたいことに合わせて使い分けるのがポイントです。

  • あるか無いかだけ知りたい → in_array()
  • 最初に見つかった位置を知りたい → array_search()
  • 同じ値すべての位置を知りたい → array_keys()

型の違いによる誤判定を避けたいときは第 3 引数の厳密比較を、array_search() の結果を判定するときは === false を使う、という 2 点を押さえておけば安心です。

参考ページ