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

作成日: 更新日:

in_array関数は、配列の中に特定の値が存在するかどうかを調べる関数です。この関数を使用することで、ある値が指定された配列に含まれているかを簡単に確認できます。

この関数は主に三つの引数を取ります。最初の引数は「探したい値($needle)」で、配列内で検索したい具体的な値を指定します。二番目の引数は「検索対象となる配列($haystack)」で、値を探す対象となる配列を渡します。三番目の引数はオプションで、「厳密な比較を行うかどうかを示す真偽値($strict)」です。

$strict引数を省略するか、またはfalseに設定した場合、in_array関数は値が等しいかどうかだけを比較し、データ型は問いません。例えば、数値の0と文字列の"0"は同じものとみなされます。一方、$strict引数をtrueに設定すると、値が等しいかどうかに加えて、データ型も完全に一致する場合にのみ、値が存在すると判断されます。この厳密な比較は、予期せぬ挙動を防ぎ、より正確な結果を得るために非常に重要です。

in_array関数の戻り値は、ブール型(真偽値)です。検索の結果、配列内に探していた値が見つかればtrue(真)を返し、見つからなければfalse(偽)を返します。配列内の要素の存在確認はプログラミングにおいて頻繁に行われる操作であり、in_array関数はその効率的な実現に役立ちます。特に$strict引数の挙動を理解し、適切に使い分けることで、意図しない結果を防ぎ、より堅牢なプログラムを作成できます。

基本的な使い方

構文(syntax)

<?php
$search_value = 'apple';
$target_array = ['apple', 'banana', 'cherry'];
$result = in_array($search_value, $target_array);
var_dump($result); // bool(true)
?>

引数(parameters)

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

  • mixed $needle: 検索したい値。配列内に存在するかどうかを確認します。
  • array $haystack: 検索対象となる配列。
  • bool $strict = false: 値の比較方法を指定します。true の場合、値だけでなく型も一致するかどうかを比較します(厳密な比較)。false(デフォルト)の場合、値のみが一致するかどうかを比較します。

戻り値(return)

bool

配列内に指定した値が存在するかどうかを真偽値 (true または false) で返します。

サンプルコード

PHP in_arrayで連想配列の値を探す

<?php

/**
 * in_array関数の使用例を示す関数です。
 * 特に連想配列での値の検索方法を解説します。
 *
 * @return void
 */
function demonstrateInArrayWithAssociativeArray(): void
{
    // 連想配列の定義
    $userProfile = [
        'id'        => 101,
        'username'  => 'alice_dev',
        'email'     => 'alice@example.com',
        'status'    => 'active',
        'age'       => 30
    ];

    echo "--- in_arrayの連想配列での値の検索例 ---\n";

    // 1. 連想配列に「値」が存在するかを検索 (デフォルトの非厳密モード)
    // 値 'alice_dev' は 'username' キーの値として存在するため true
    $searchValue1 = 'alice_dev';
    if (in_array($searchValue1, $userProfile)) {
        echo "値 '{$searchValue1}' は配列に存在します。\n"; // この行が出力される
    } else {
        echo "値 '{$searchValue1}' は配列に存在しません。\n";
    }

    // 2. 存在しない値を検索
    // 値 'bob_dev' は配列に存在しないため false
    $searchValue2 = 'bob_dev';
    if (in_array($searchValue2, $userProfile)) {
        echo "値 '{$searchValue2}' は配列に存在します。\n";
    } else {
        echo "値 '{$searchValue2}' は配列に存在しません。\n"; // この行が出力される
    }

    // 3. 厳密モード (bool $strict = true) で値を検索
    // 'id' の値は整数型 (101) です。
    // 検索値 '101' は文字列型のため、厳密モードでは見つかりません。
    $searchValue3 = '101'; // 文字列型
    if (in_array($searchValue3, $userProfile, true)) {
        echo "厳密モード: 値 '{$searchValue3}' (文字列) は配列に存在します。\n";
    } else {
        echo "厳密モード: 値 '{$searchValue3}' (文字列) は配列に存在しません。\n"; // この行が出力される
    }

    // 4. 厳密モードで型も一致する値を検索
    // 検索値 101 は整数型で、配列の 'id' の値も整数型のため、厳密モードでも見つかります。
    $searchValue4 = 101; // 整数型
    if (in_array($searchValue4, $userProfile, true)) {
        echo "厳密モード: 値 '{$searchValue4}' (整数) は配列に存在します。\n"; // この行が出力される
    } else {
        echo "厳密モード: 値 '{$searchValue4}' (整数) は配列に存在しません。\n";
    }

    // 補足: in_array関数は、配列の「値」を検索します。
    // キー(例: 'id', 'username')が存在するかを確認したい場合は、
    // array_key_exists() 関数や isset() 関数を使用します。
    // 例: in_array('id', $userProfile) は false を返します。
}

// 関数を実行して動作を確認します
demonstrateInArrayWithAssociativeArray();

in_array関数は、配列の中に指定した値が存在するかどうかを調べるための関数です。第一引数には検索したい値、第二引数には検索対象の配列を指定します。この関数は、連想配列の場合はキーではなく「値」を検索対象とします。値が見つかればtrue、見つからなければfalseを返します。

このサンプルコードでは、ユーザー情報の連想配列を例に、値の検索方法を示しています。第三引数にtrueを指定すると、検索は「厳密モード」になります。デフォルトの状態(非厳密モード)では、'101'(文字列)と101(整数)は同じ値と見なされます。しかし、厳密モードを有効にすると、値だけでなくデータ型も一致している必要があるため、これらは別の値として扱われます。サンプルコードで示されているように、配列内のidの値は整数101なので、厳密モードで文字列'101'を検索した場合はfalseが返り、整数101で検索した場合はtrueが返ります。このように、型の違いを明確に区別したい場合に厳密モードが役立ちます。

in_array関数は、連想配列の場合でも、配列の「値」の中に目的のデータがあるかを検索する関数です。キー(例えば'id'や'username')が存在するかを調べたい場合は利用できません。その場合はarray_key_exists()関数やisset()関数を使用してください。特に注意が必要なのは、第3引数strictです。これを省略すると、デフォルトで型を区別しない非厳密な検索が行われます。これにより、数値の101と文字列の"101"が同じものとして扱われることがあります。値とデータの型が完全に一致するかを調べたい場合は、第3引数にtrueを指定してください。こうすることで、数値と文字列を厳密に区別した正確な検索が可能となり、思わぬ間違いを防ぐことができます。

PHP in_arrayisset のパフォーマンス比較

<?php

/**
 * 大規模な配列における in_array と isset のパフォーマンスを比較します。
 *
 * in_array()は配列を最初から順に検索するため、要素数が多い場合に遅くなる傾向があります。
 * 一方、配列の値をキーに変換したハッシュマップ(連想配列)を用意し、
 * isset()でキーの存在をチェックする方法は、非常に高速に動作します。
 */
function compareInArrayAndIssetPerformance(): void
{
    // 比較用の巨大な配列を生成 (0から999,999までの100万要素)
    $largeHaystack = range(0, 999999);
    $searchCount = 1000;

    // 検索対象の値 (配列の最後尾に存在する)
    $needle = 999999;

    // --- 方法1: in_array() を使った検索 ---
    $startTimeInArray = microtime(true);

    for ($i = 0; $i < $searchCount; $i++) {
        // 配列内に$needleが存在するかをチェック
        in_array($needle, $largeHaystack, true);
    }

    $endTimeInArray = microtime(true);
    $executionTimeInArray = $endTimeInArray - $startTimeInArray;

    echo "--- in_array() performance ---" . PHP_EOL;
    printf("Execution time for %d searches: %.6f seconds" . PHP_EOL, $searchCount, $executionTimeInArray);
    echo PHP_EOL;


    // --- 方法2: isset() を使った高速な検索 ---

    // 事前に配列の値をキーに変換した検索用テーブルを作成
    // この準備時間は、同じ配列に対して何度も検索を行う場合に償却されます。
    $lookupTable = array_flip($largeHaystack);

    $startTimeIsset = microtime(true);

    for ($i = 0; $i < $searchCount; $i++) {
        // 連想配列のキーとして$needleが存在するかをチェック
        isset($lookupTable[$needle]);
    }

    $endTimeIsset = microtime(true);
    $executionTimeIsset = $endTimeIsset - $startTimeIsset;

    echo "--- isset() with a flipped array performance ---" . PHP_EOL;
    printf("Execution time for %d searches: %.6f seconds" . PHP_EOL, $searchCount, $executionTimeIsset);
    echo PHP_EOL;
    
    // パフォーマンスの比較結果を表示
    if ($executionTimeIsset > 0) {
        printf("isset() is approximately %.2f times faster than in_array() in this case." . PHP_EOL, $executionTimeInArray / $executionTimeIsset);
    }
}

// 関数を実行
compareInArrayAndIssetPerformance();

in_array関数は、指定した配列の中に特定の値が存在するかどうかを調べるための関数です。第1引数 $needle に探したい値を、第2引数 $haystack に検索対象の配列を指定します。値が見つかれば true、見つからなければ false の真偽値を返します。オプションの第3引数 $stricttrue を指定すると、値だけでなくデータ型も一致するかを厳密に比較します。

このサンプルコードは、in_array関数と、連想配列のキーの存在を調べる isset の実行速度を比較しています。in_arrayは配列の要素を先頭から一つずつ順番に調べるため、サンプルコードのような大規模な配列では検索に時間がかかる傾向があります。

一方、isset を用いる方法では、まず array_flip 関数で配列の「値」と「キー」を入れ替えた、検索用の新しい連想配列を作成します。isset を使ったキーの存在チェックは、配列の要素数にほとんど影響されず非常に高速に動作します。このコードは、巨大な配列に対して繰り返し検索を行うような処理では、事前に一手間加えて isset を利用する手法が in_array よりもはるかに高いパフォーマンスを発揮することを示しています。

サンプルコードは、大規模な配列で要素を検索する場合、in_arrayよりもarray_flipissetを組み合わせる方が高速なことを示しています。ただし、この高速な手法には注意が必要です。array_flipは配列の値とキーを入れ替えるため、元の配列の値に重複があると、後の値で上書きされてしまい正しく検索できません。また、値がキーとして有効な文字列か整数でなければ利用できません。この方法は、値がユニークな配列に対して繰り返し検索を行う場合に特に有効です。in_array関数自体を使う際は、第三引数にtrueを指定するとデータ型まで比較する厳密な検索となり、予期せぬ不具合を防ぐために推奨されます。

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