【PHP8.x】array_search関数の使い方

作成日: 更新日:

array_search関数は、指定された値が配列の中に存在するかどうかを検索し、その値が見つかった場合のキー(インデックス)を返す関数です。この関数は、複数のデータが格納された配列の中から、特定の要素の位置を効率的に探し出したい場合に非常に役立ちます。

この関数を使用する際は、まず検索したい値と、その値が含まれる可能性のある配列を引数として指定します。もし指定した値が配列の中から見つかった場合、array_search関数は、その値が格納されている位置を示すキーを返します。例えば、数値が0から始まる配列であれば、0、1、2といった整数値がキーとして返されます。

一方、もし配列の中に指定した値が見つからなかった場合は、論理値のfalseを返します。このfalseという戻り値は、検索が成功しなかったことを明確に示しますので、この関数の結果を受け取った際には、falseかどうかを適切にチェックして、次の処理を分岐させることが重要です。

さらに、array_search関数にはオプションで第三引数を指定することができます。この第三引数をtrueに設定すると、値の比較を行う際に、値だけでなくデータの型も厳密に一致するかどうかを調べます。これにより、数値の5と文字列の"5"のように、値は同じでも型が異なるデータを区別して検索することが可能となり、より厳密な検索を行いたい場合に利用されます。

array_search関数は、配列操作の基本でありながら、配列内の特定要素の特定に広く利用される基本的な関数です。

基本的な使い方

構文(syntax)

<?php
$data = ['apple', 'banana', 'orange', 10, '10'];
$search_item = 'banana';
$strict_search_item = 10;

$key_simple_search = array_search($search_item, $data);
$key_non_strict_number_search = array_search($strict_search_item, $data);
$key_strict_number_search = array_search($strict_search_item, $data, true);
$key_not_found = array_search('grape', $data);
?>

引数(parameters)

mixed $needle, array $haystack, bool $strict = false

  • mixed $needle: 検索したい値
  • array $haystack: 検索対象となる配列
  • bool $strict = false: 真偽値。trueの場合、厳密な比較(値と型が一致するか)を行う

戻り値(return)

string|int|false

指定された値を配列の中から検索し、最初に見つかった要素のキーを返します。見つからなかった場合は false を返します。

サンプルコード

PHP array_search で複数ヒット時の挙動

<?php

/**
 * array_search 関数の基本的な使い方を示すサンプルコードです。
 * キーワード「複数」を考慮し、同じ値が配列に複数存在する場合でも
 * array_search が最初に見つかったキーのみを返す挙動を実演します。
 */
function demonstrateArraySearchMultipleOccurrences(): void
{
    // 検索対象の配列。'apple' が複数回出現します。
    $fruits = ['apple', 'banana', 'orange', 'apple', 'grape', 'apple'];
    $searchValue = 'apple';

    // array_search は、配列内で検索値が見つかった場合、その最初のキーを返します。
    // ここでは 'apple' が複数回出現しますが、関数はインデックス 0 を返します。
    $firstOccurrenceKey = array_search($searchValue, $fruits);

    if ($firstOccurrenceKey !== false) {
        echo "値 '{$searchValue}' は配列のキー {$firstOccurrenceKey} で最初に見つかりました。\n";
    } else {
        echo "値 '{$searchValue}' は配列に見つかりませんでした。\n";
    }

    echo "----------------------------------------\n";

    // array_search の厳密な比較 (strict) モードの例。
    // このモードでは、値だけでなく型も一致する必要があります。
    $mixedValues = [1, '2', 3, '1', 1.0];
    $searchStrictValue = 1; // 整数型 1 を検索

    // strict パラメータを true に設定すると、型も比較されます (===)。
    // この場合、インデックス 0 の '1' (整数) が一致し、インデックス 3 の '1' (文字列) や
    // インデックス 4 の 1.0 (浮動小数点数) は型が異なるため一致しません。
    $strictKey = array_search($searchStrictValue, $mixedValues, true);

    if ($strictKey !== false) {
        echo "厳密な比較で値 '{$searchStrictValue}' (型: " . gettype($searchStrictValue) . ") は配列のキー {$strictKey} で最初に見つかりました。\n";
    } else {
        echo "厳密な比較で値 '{$searchStrictValue}' (型: " . gettype($searchStrictValue) . ") は配列に見つかりませんでした。\n";
    }
}

// サンプル関数の実行
demonstrateArraySearchMultipleOccurrences();

PHPのarray_search関数は、配列の中から指定した値を探し、最初に見つかったキー(インデックス番号または連想配列の文字列キー)を返す関数です。

第一引数$needleには検索したい値を、第二引数$haystackには検索対象となる配列を指定します。第三引数$strictはオプションで、trueに設定すると値だけでなくデータ型も厳密に比較します。この引数を省略した場合(デフォルトfalse)、PHPは値を比較する際に必要に応じて型を変換します。

array_searchは、検索値が配列内に複数存在する場合でも、最初に見つかった値のキーのみを返します。例えば、同じ値が配列の異なる位置に複数ある場合でも、関数は一番初めに見つかったその位置のキーのみを報告します。

検索値が見つかった場合はそのキー(整数または文字列)を、見つからなかった場合はfalseを返します。戻り値が0などの有効なキーである可能性もあるため、結果を確認する際はif ($result !== false)のように厳密な比較を用いることが重要です。

strictモードをtrueにすると、値と型が完全に一致する場合にのみ見つかったと判断します。例えば、整数1と文字列'1'は値は同じでも型が異なるため、strictモードでは別物として扱われます。これにより、型変換による意図しない結果を防ぎ、より正確な検索が可能になります。

array_search関数は、配列内に検索値が複数存在しても最初に見つかったキーのみを返します。すべての出現箇所を探したい場合は、ループ処理など別の方法を検討してください。戻り値はキー(整数または文字列)か、値が見つからない場合はブール値falseです。配列のキーが0の場合とfalseを混同しないよう、検索結果の確認には!== falseのような厳密な比較を必ず使用してください。また、第三引数stricttrueに設定すると、値だけでなく型も厳密に比較されるため、予期せぬ型変換によるバグを防ぐために活用を推奨します。

PHP連想配列のarray_searchによる値検索

<?php

/**
 * 連想配列から特定の値を検索し、そのキーを特定するサンプルコードです。
 * array_search関数は、指定した値が配列内に存在するかどうかを調べ、
 * 見つかった場合はその要素のキーを返します。見つからない場合はfalseを返します。
 */

/**
 * array_search_associative_array_example 関数
 *
 * 連想配列に対して array_search() 関数を使用する例を示します。
 */
function array_search_associative_array_example(): void
{
    // 検索対象となる連想配列を定義します。
    // キーは文字列、値も文字列です。
    $users = [
        'john_doe' => 'John Doe',
        'jane_smith' => 'Jane Smith',
        'peter_jones' => 'Peter Jones',
        'alice_williams' => 'Alice Williams',
        'guest_user' => '123', // 値が数値のように見えるが、型は文字列
    ];

    echo "--- 存在する値の検索 (デフォルトモード: 非厳密) ---\n";

    // 存在する値 'Jane Smith' を検索します。
    // array_search($needle, $haystack, $strict = false)
    // 第3引数を省略した場合、非厳密モード (false) となり、値の比較時に型を考慮しません。
    $searchTerm1 = 'Jane Smith';
    $key1 = array_search($searchTerm1, $users);

    // 検索結果がfalseではないことを確認します。
    // array_searchは、見つからない場合にfalseを返すため、厳密な比較 (=== false または !== false) を推奨します。
    if ($key1 !== false) {
        echo "値 '{$searchTerm1}' はキー '{$key1}' で見つかりました。\n";
    } else {
        echo "値 '{$searchTerm1}' は見つかりませんでした。\n";
    }

    echo "\n--- 存在しない値の検索 (デフォルトモード: 非厳密) ---\n";

    // 存在しない値 'Mike Davis' を検索します。
    $searchTerm2 = 'Mike Davis';
    $key2 = array_search($searchTerm2, $users);

    if ($key2 !== false) {
        echo "値 '{$searchTerm2}' はキー '{$key2}' で見つかりました。\n";
    } else {
        echo "値 '{$searchTerm2}' は見つかりませんでした。\n";
    }

    echo "\n--- 厳密モードでの検索 (型も比較) ---\n";

    // 値が文字列 '123' のエントリが存在します。
    // 検索値として数値の 123 を使用してみます。

    // 非厳密モードの場合 (strict = false):
    // PHPは自動的に型変換を試みるため、文字列 '123' と数値 123 は同じと見なされます。
    $searchTerm3 = 123; // 数値型
    $key3_nonStrict = array_search($searchTerm3, $users, false); // 第3引数を明示的にfalseに指定

    if ($key3_nonStrict !== false) {
        echo "非厳密モード: 値 '{$searchTerm3}' (数値) はキー '{$key3_nonStrict}' で見つかりました。\n";
    } else {
        echo "非厳密モード: 値 '{$searchTerm3}' (数値) は見つかりませんでした。\n";
    }

    // 厳密モードの場合 (strict = true):
    // 値と型の両方が一致する場合にのみ見つかります。
    // '123' (文字列) と 123 (数値) は型が異なるため、一致しません。
    $searchTerm4 = 123; // 数値型
    $key4_strict = array_search($searchTerm4, $users, true); // 第3引数をtrueに指定

    if ($key4_strict !== false) {
        echo "厳密モード: 値 '{$searchTerm4}' (数値) はキー '{$key4_strict}' で見つかりました。\n";
    } else {
        echo "厳密モード: 値 '{$searchTerm4}' (数値) は見つかりませんでした。\n";
    }

    // 厳密モードで文字列 '123' を検索する場合
    $searchTerm5 = '123'; // 文字列型
    $key5_strict = array_search($searchTerm5, $users, true);

    if ($key5_strict !== false) {
        echo "厳密モード: 値 '{$searchTerm5}' (文字列) はキー '{$key5_strict}' で見つかりました。\n";
    } else {
        echo "厳密モード: 値 '{$searchTerm5}' (文字列) は見つかりませんでした。\n";
    }
}

// 関数を実行します。
array_search_associative_array_example();

PHPのarray_search関数は、配列の中から特定の値を検索し、その値に対応するキー(添字)を見つける際に使用します。

この関数は3つの引数を取ります。最初の$needleは検索したい値、次の$haystackは検索対象となる配列です。最後の$strictはオプションの引数で、デフォルトはfalseです。$strictfalseの場合、値の比較時に型を考慮しません。trueに設定すると、値と型の両方が一致する場合にのみ見つけます。値が見つかるとそのキー(添字)を返し、見つからなかった場合はfalseを返します。このfalseという戻り値は、他の有効なキー(0など)と区別するために、厳密な比較(!== false)で確認することが推奨されます。

サンプルコードでは、ユーザー名と対応する表示名を持つ連想配列$usersを用いています。例えば、存在する値'Jane Smith'を検索すると、そのキー'jane_smith'が返されます。存在しない値'Mike Davis'を検索した場合はfalseが返されます。

特に$strict引数は重要で、例えば文字列'123'と数値123のように、値は同じでも型が異なる場合を区別できます。デフォルトの非厳密モードではこれらを同じと見なしますが、厳密モード($strict = true)では型が異なるため一致しないと判断され、より正確な検索が可能です。これにより、意図しないマッチングを防ぐことができます。

array_search関数は、配列から指定した値を探し、最初に見つかったそのキーを返します。値が見つからない場合はfalseを返します。このfalseという戻り値は、キーが0である場合と区別するため、検索結果の判定には=== falseまたは!== falseのような厳密な比較を用いることが重要です。

第三引数のstrictは、値の比較時にデータ型も考慮するかどうかを制御します。デフォルトのfalse(非厳密)の場合、123(数値)と'123'(文字列)のように型が異なっても値が等しければ同じものと見なされることがあります。trueを指定すると、値と型の両方が完全に一致する場合のみ見つかったと判定します。意図しない検索結果を避けるため、特に異なる型の値が混在する可能性がある場合は、strict引数をtrueに設定することを検討しましょう。

【PHP8.x】array_search関数の使い方 | いっしー@Webエンジニア