配列

PHP array_search関数の使い方について解説

PHPのarray_search関数は、配列から指定した値を検索し、そのキーを返す機能を持っています。

値が見つからない場合はfalseが返されるため、結果の確認方法に注意する必要があります。

この記事では、基本的な使い方や注意点をわかりやすく解説します。

基本構文

関数の書式

PHP の array_search関数は、指定した値を配列内から検索し、最初に見つかったキーを返す関数です。

書式は以下のようになっており、配列と検索対象の値、そして省略可能な厳密比較オプションを引数として取ります。

$result = array_search($searchValue, $array, $strict);

配列の指定方法

配列は通常、リテラルで定義するか、既存の変数に格納された配列を指定します。

例えば、次のような数値の配列を指定できます。

$numbers = [10, 20, 30, 40];

また、連想配列の場合はキーと値のペアで定義します。

$ages = [
    "Alice" => 25,
    "Bob"   => 30,
    "Carol" => 35
];

検索する値の設定

検索する値は、配列内の要素と一致する必要があり、単一の値や変数を指定します。

例えば、上記の数値の配列から 30 を検索する場合は、次のように記述します。

$searchValue = 30;
$result = array_search($searchValue, $numbers);

この場合、配列内で 30 が格納されている位置(キー)が返ります。

厳密比較オプションstrictの動作

第三引数である $stricttrue に設定すると、型の違いまで厳密に比較します。

デフォルトでは、false となっているため、数値と文字列の比較も成功する場合があります。

例えば、以下の例では厳密比較を行うかどうかで返り値が異なります。

$array = [1, "1", 2];
$searchValue = 1;
// 厳密比較なし(デフォルト)
$result1 = array_search($searchValue, $array);  // 結果は最初の要素のキー: 0
// 厳密比較あり
$result2 = array_search($searchValue, $array, true);  // 結果は1番目のキー: 0 または "1" は型が異なるためスキップされる

返却値の挙動

array_search関数は、値が見つかった場合に対応するキーを返し、見つからなかった場合は false を返します。

なお、返却される値は数値または文字列になる点に注意が必要です。

正常時の返り値

正常に一致する値が配列内に存在する場合、その要素のキーが返されます。

連想配列の場合は指定したキー(文字列)になり、数値の配列の場合は添字(整数)が返されます。

返却されるキーの型と種類

配列内のキーは、以下のように異なる型となる場合があります。

  • 数値配列の場合:整数型(例:0, 1, 2, …)
  • 連想配列の場合:文字列型(例:”Alice”, “Bob”)

このため、返却されたキーの型も用途に応じて判別する必要があります。

失敗時の挙動

配列内に指定した値が見つからなかった場合、array_searchfalse を返します。

そのため、返り値の型が整数の場合と false である場合の判別が求められます。

falseと0の区別

数値配列の先頭(キー 0)に検索値が存在する場合、返り値は 0 となります。

しかし、0 は論理値では偽とみなされるため、条件分岐で false と混同しないよう、厳密な比較===を用いて判定する必要があります。

$numbers = [100, 200, 300];
$result = array_search(100, $numbers);
if ($result === false) {
    echo "値は配列内に存在しません。";
} else {
    echo "値はキー{$result}に存在します。";
}
値はキー0に存在します。

利用例

シンプルな配列での使用例

実例1:基本的な利用

単純な数値配列における array_search の基本的な使い方を示します。

$numbers = [5, 10, 15, 20];  // 数値が格納された配列
$target = 15;               // 検索対象の値
$key = array_search($target, $numbers);
if ($key === false) {
    echo "対象の値は配列に存在しません。";
} else {
    echo "対象の値はキー{$key}で見つかりました。";
}
対象の値はキー2で見つかりました。

実例2:値が重複する場合の挙動

配列内に同じ値が複数存在する場合、array_search は最初に見つかった要素のキーを返します。

$numbers = [7, 14, 7, 21];   // 同じ値7が複数存在する配列
$target = 7;                 // 検索する値
$key = array_search($target, $numbers);
if ($key === false) {
    echo "値は配列に存在しません。";
} else {
    echo "対象の値はキー{$key}で最初に見つかりました。";
}
対象の値はキー0で最初に見つかりました。

複雑な配列での使用例

多次元配列における検索

array_search は基本的に一次元配列の検索を対象としており、直接多次元配列に対して使用すると内部配列との一致を判定するため、期待通りの結果とならないことがあります。

多次元配列の場合、ループや再帰処理を用いる必要があります。

以下は、各内側の配列内で検索する例です。

$data = [
    ['id' => 101, 'name' => 'Alice'],
    ['id' => 102, 'name' => 'Bob'],
    ['id' => 103, 'name' => 'Carol']
];
$searchId = 102;
$foundKey = false;
// 各内側の配列内で'id'キーの値を比較する
foreach ($data as $key => $entry) {
    if (array_search($searchId, $entry, true) !== false) {
        $foundKey = $key;
        break;
    }
}
if ($foundKey === false) {
    echo "ID {$searchId} は存在しません。";
} else {
    echo "ID {$searchId} はサブ配列のキー{$foundKey}に存在します。";
}
ID 102 はサブ配列のキー1に存在します。

注意事項

型比較に関する落とし穴

厳密比較オプションの影響

厳密比較オプション $stricttrue に設定すると、値だけでなく型も含めて比較されます。

そのため、例えば文字列 "1" と整数 1 は一致しないと判定され、意図しない結果を避けることができます。

逆に、厳密比較を行わない場合、型の違いを無視してしまうため、期待しないマッチが発生する可能性があります。

$array = [1, "1", 2];
$search = 1;
// 厳密比較なしの場合、最初の要素で一致と判定される
$resultNonStrict = array_search($search, $array);
// 厳密比較ありの場合、型が一致する最初の要素を探す
$resultStrict = array_search($search, $array, true);
$resultNonStrict の値は 0、$resultStrict の値は 0 となる場合もあるが、配列の構造によっては異なる結果となる。

結果判定時の注意点

条件分岐での扱い

array_search の返り値は、検索対象のキーとなるため、キーが 0 でも正しく値が見つかった状態です。

そのため、条件分岐では == ではなく === を用いて厳密に比較する必要があります。

$numbers = [0 => "apple", 1 => "banana"];
$target = "apple";
$result = array_search($target, $numbers);
// 厳密比較を用いて 0 と false をしっかり区別する
if ($result === false) {
    echo "対象の値は見つかりませんでした。";
} else {
    echo "対象の値はキー{$result}に存在します。";
}
対象の値はキー0に存在します。

パフォーマンス検討

大規模配列での実行速度

大規模な配列に対して array_search を使用する場合、配列全体を線形探索するため、配列のサイズが大きいと処理時間も長くなる可能性があります。

また、ループや再帰処理を組み合わせた場合は、パフォーマンスへの影響がさらに増すため、より効率的なデータ検索手法が望ましい場合もあります。

$largeArray = range(1, 100000);  // 1から10万までの数値を持つ大規模配列
$searchValue = 99999;
$start = microtime(true);
$result = array_search($searchValue, $largeArray, true);
$end = microtime(true);
echo "検索時間: " . ($end - $start) . " 秒";
検索時間: 0.0008 秒

他の検索関数との比較検証

array_search は検索キーを返す点で特に有用ですが、単に値の存在確認を行いたい場合は in_array を使用することも検討できます。

in_array は一致する値が存在するかどうかの真偽値を返すため、処理内容に応じて使い分けることが大切です。

以下は、array_searchin_array の使い分け例です。

$array = ["red", "green", "blue"];
$target = "green";
// 存在判定だけを行う場合
if (in_array($target, $array, true)) {
    echo "{$target} は配列に存在します。";
} else {
    echo "{$target} は配列に存在しません。";
}
green は配列に存在します。

まとめ

この記事では、PHP の array_search関数の基本文法、配列の指定方法、検索値の設定や strict オプションの動作、返却値の挙動、利用例や注意事項、パフォーマンス検討について解説しました。

各機能の使い方とその細かい挙動、型や条件分岐に関する注意点が理解できる内容でした。

ぜひ、この知識を活用して、自身のコード品質向上にチャレンジしてください。

関連記事

Back to top button
目次へ