【PHP8.x】in_array()関数の使い方
in_array関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
in_array関数は、配列の中に特定の値が存在するかどうかを調べる関数です。この関数を使用することで、ある値が指定された配列に含まれているかを簡単に確認できます。
この関数は主に三つの引数を取ります。最初の引数は「探したい値($needle)」で、配列内で検索したい具体的な値を指定します。二番目の引数は「検索対象となる配列($haystack)」で、値を探す対象となる配列を渡します。三番目の引数はオプションで、「厳密な比較を行うかどうかを示す真偽値($strict)」です。
$strict引数を省略するか、またはfalseに設定した場合、in_array関数は値が等しいかどうかだけを比較し、データ型は問いません。例えば、数値の0と文字列の"0"は同じものとみなされます。一方、$strict引数をtrueに設定すると、値が等しいかどうかに加えて、データ型も完全に一致する場合にのみ、値が存在すると判断されます。この厳密な比較は、予期せぬ挙動を防ぎ、より正確な結果を得るために非常に重要です。
in_array関数の戻り値は、ブール型(真偽値)です。検索の結果、配列内に探していた値が見つかればtrue(真)を返し、見つからなければfalse(偽)を返します。配列内の要素の存在確認はプログラミングにおいて頻繁に行われる操作であり、in_array関数はその効率的な実現に役立ちます。特に$strict引数の挙動を理解し、適切に使い分けることで、意図しない結果を防ぎ、より堅牢なプログラムを作成できます。
構文(syntax)
1<?php 2$search_value = 'apple'; 3$target_array = ['apple', 'banana', 'cherry']; 4$result = in_array($search_value, $target_array); 5var_dump($result); // bool(true) 6?>
引数(parameters)
mixed $needle, array $haystack, bool $strict = false
- mixed $needle: 検索したい値。配列内に存在するかどうかを確認します。
- array $haystack: 検索対象となる配列。
- bool $strict = false: 値の比較方法を指定します。
trueの場合、値だけでなく型も一致するかどうかを比較します(厳密な比較)。false(デフォルト)の場合、値のみが一致するかどうかを比較します。
戻り値(return)
bool
配列内に指定した値が存在するかどうかを真偽値 (true または false) で返します。
サンプルコード
PHP in_arrayで配列の値を探す
1<?php 2 3/** 4 * in_array関数の基本的な使い方を示すサンプルコードです。 5 * この関数は、配列の中に特定の値が存在するかどうかをチェックします。 6 * 7 * 【重要】in_array() 関数は配列の『値』を検索します。『キー』の存在を確認したい場合は、 8 * array_key_exists() 関数や isset() 関数を使用してください。 9 */ 10function demonstrateInArrayUsage(): void 11{ 12 // 検索対象の配列を定義します。 13 $fruits = ['apple', 'banana', 'orange', 'grape']; 14 $mixedValues = [1, 2, '3', 4, true]; // 異なる型の値を含む配列 15 16 echo "--- 文字列の配列でのin_array ---" . PHP_EOL; 17 18 // 1. デフォルトモード (strict=false): 値の比較のみ (型は考慮しない) 19 // 'banana' が $fruits 配列に存在するか確認 20 if (in_array('banana', $fruits)) { 21 echo "'banana' は配列に存在します (strict=false)。" . PHP_EOL; 22 } else { 23 echo "'banana' は配列に存在しません (strict=false)。" . PHP_EOL; 24 } 25 26 // 'kiwi' が $fruits 配列に存在するか確認 27 if (in_array('kiwi', $fruits)) { 28 echo "'kiwi' は配列に存在します (strict=false)。" . PHP_EOL; 29 } else { 30 echo "'kiwi' は配列に存在しません (strict=false)。" . PHP_EOL; 31 } 32 33 echo PHP_EOL . "--- 異なる型を含む配列でのin_array (strictモードの違い) ---" . PHP_EOL; 34 35 // 2. strict=false の場合: 型を考慮せず、値が等しいかをチェック 36 // 数値の 3 が $mixedValues に存在するか確認。文字列 '3' とマッチします。 37 if (in_array(3, $mixedValues, false)) { 38 echo "strict=false の場合、数値 3 は配列に存在します (文字列 '3' とマッチ)。" . PHP_EOL; 39 } else { 40 echo "strict=false の場合、数値 3 は配列に存在しません。" . PHP_EOL; 41 } 42 43 // 3. strict=true の場合: 型と値の両方が等しいかをチェック 44 // 数値の 3 が $mixedValues に存在するか確認。文字列 '3' とは型が異なるためマッチしません。 45 if (in_array(3, $mixedValues, true)) { 46 echo "strict=true の場合、数値 3 は配列に存在します。" . PHP_EOL; 47 } else { 48 echo "strict=true の場合、数値 3 は配列に存在しません (文字列 '3' とは型が異なります)。" . PHP_EOL; 49 } 50 51 // 実際に配列にある文字列 '3' を strict=true で検索 52 if (in_array('3', $mixedValues, true)) { 53 echo "strict=true の場合、文字列 '3' は配列に存在します。" . PHP_EOL; 54 } else { 55 echo "strict=true の場合、文字列 '3' は配列に存在しません。" . PHP_EOL; 56 } 57 58 // 論理値 true の検索 (strict=false の場合、1 とマッチ) 59 if (in_array(true, $mixedValues, false)) { 60 echo "strict=false の場合、論理値 true は配列に存在します (数値 1 とマッチ)。" . PHP_EOL; 61 } else { 62 echo "strict=false の場合、論理値 true は配列に存在しません。" . PHP_EOL; 63 } 64 65 // 論理値 true の検索 (strict=true の場合、型が異なるため 1 とはマッチしない) 66 if (in_array(true, $mixedValues, true)) { 67 echo "strict=true の場合、論理値 true は配列に存在します。" . PHP_EOL; 68 } else { 69 echo "strict=true の場合、論理値 true は配列に存在しません (数値 1 とは型が異なります)。" . PHP_EOL; 70 } 71} 72 73// サンプル関数を実行します。 74demonstrateInArrayUsage();
PHPのin_array関数は、配列の中に特定の値が含まれているかをチェックするために使用します。この関数は、最初の引数$needleで指定した検索値が、2番目の引数$haystackで指定した配列内に存在するかどうかを調べます。値が見つかればtrueを、見つからなければfalseを戻り値として返します。
3番目の引数$strictは省略可能で、デフォルトではfalseに設定されています。$strictがfalseの場合、in_array関数は値の比較を行う際に型を厳密にチェックせず、例えば数値の3と文字列の'3'を同じものとして扱います。しかし、$strictをtrueに設定すると、値だけでなく型も厳密に一致する場合にのみ「存在する」と判断します。このため、数値3と文字列'3'は異なるものとして扱われます。
サンプルコードでは、まず文字列の配列で値の存在を確認する基本的な使い方を示しています。次に、数値、文字列、真偽値が混在する配列を用いて、$strict引数をfalseとtrueにした場合の比較の違いを具体的に確認できます。特に、strict=falseでは数値の3が文字列の'3'と、また論理値のtrueが数値の1とマッチする様子がわかります。
なお、in_array関数は配列の『値』のみを検索します。『キー』の存在を確認したい場合は、array_key_exists()関数やisset()関数を使用する必要がある点にご注意ください。
in_array関数は、配列の中に特定の値が存在するかどうかをチェックします。最も重要な注意点は、この関数が配列の「値」を検索する点です。「キー」の存在を確認したい場合は、array_key_exists()関数やisset()関数を使用してください。
また、第3引数の$strictは比較の厳密さを制御します。デフォルトのfalseでは型を考慮せず、値が同等であれば一致と判断されます。例えば、数値の1と論理値のtrue、数値の3と文字列の'3'が一致とみなされることがあります。予期せぬ結果を避けるため、値と型の両方が完全に一致するかを確認したい場合は、$strict引数にtrueを指定してください。これにより、より安全で厳密な比較が行えます。
PHP in_array で複数要素の存在チェック
1<?php 2 3/** 4 * 複数の要素のうち、いずれかが指定された配列に含まれているかをチェックします。 5 * in_array 関数を内部で繰り返し使用し、最初の合致で真を返します。 6 * 7 * @param array $needles 検索する複数の要素を格納した配列。 8 * @param array $haystack 検索対象となる配列。 9 * @param bool $strict true の場合、in_array は厳密な型チェックを行います (===)。 10 * false の場合、in_array は緩やかな型チェックを行います (==)。 11 * @return bool いずれかの要素が見つかれば true、一つも見つからなければ false を返します。 12 */ 13function containsAny(array $needles, array $haystack, bool $strict = false): bool 14{ 15 // 検索する各要素に対してループ処理を行います 16 foreach ($needles as $needle) { 17 // 現在の要素が検索対象の配列に含まれているか in_array でチェックします 18 if (in_array($needle, $haystack, $strict)) { 19 return true; // 一つでも見つかれば、すぐに true を返して処理を終了します 20 } 21 } 22 23 // すべての要素をチェックし終え、一つも見つからなかった場合は false を返します 24 return false; 25} 26 27// --- 使用例 --- 28 29// 果物の配列を定義 30$fruits = ['apple', 'banana', 'cherry', 'date']; 31 32// 複数の果物を検索する例 33$searchFruits1 = ['apple', 'grape']; // 'apple' は存在するが 'grape' は存在しない 34$searchFruits2 = ['mango', 'orange']; // どちらも存在しない 35$searchFruits3 = ['banana', 'date']; // どちらも存在する 36 37echo "--- 文字列の検索 ---" . PHP_EOL; 38 39// 例1: 'apple' または 'grape' が $fruits に含まれているか (緩やかな型チェック) 40if (containsAny($searchFruits1, $fruits)) { 41 echo "Case 1: 'apple' または 'grape' が果物配列に見つかりました。 (結果: true)" . PHP_EOL; 42} else { 43 echo "Case 1: 'apple' も 'grape' も果物配列に見つかりませんでした。 (結果: false)" . PHP_EOL; 44} 45 46// 例2: 'mango' または 'orange' が $fruits に含まれているか (緩やかな型チェック) 47if (containsAny($searchFruits2, $fruits)) { 48 echo "Case 2: 'mango' または 'orange' が果物配列に見つかりました。 (結果: true)" . PHP_EOL; 49} else { 50 echo "Case 2: 'mango' も 'orange' も果物配列に見つかりませんでした。 (結果: false)" . PHP_EOL; 51} 52 53// 例3: 'banana' または 'date' が $fruits に含まれているか (厳密な型チェック) 54if (containsAny($searchFruits3, $fruits, true)) { 55 echo "Case 3: 'banana' または 'date' が果物配列に見つかりました。(厳密なチェック) (結果: true)" . PHP_EOL; 56} else { 57 echo "Case 3: 'banana' も 'date' も果物配列に見つかりませんでした。(厳密なチェック) (結果: false)" . PHP_EOL; 58} 59 60echo PHP_EOL . "--- 数値と型の検索 ---" . PHP_EOL; 61 62// 数値を含む配列(異なる型の数値も含む) 63$numbers = [1, '2', 3, 4.0]; 64 65// 検索したい複数の数値 66$searchNumbers1 = [2, 5.0]; // 配列内には整数2も文字列'2'も5.0もない 67$searchNumbers2 = [1, 4]; // 配列内には整数1と浮動小数点数4.0がある 68 69// 例4: 整数 2 または浮動小数点数 5.0 が $numbers に含まれているか (緩やかな型チェック) 70// 緩やかなチェックでは 2 (int) は '2' (string) と同等とみなされるため true 71if (containsAny($searchNumbers1, $numbers)) { 72 echo "Case 4: 整数 2 または浮動小数点数 5.0 が数値配列に見つかりました。(緩やかなチェック) (結果: true)" . PHP_EOL; 73} else { 74 echo "Case 4: 整数 2 も浮動小数点数 5.0 も数値配列に見つかりませんでした。(緩やかなチェック) (結果: false)" . PHP_EOL; 75} 76 77// 例5: 整数 2 または浮動小数点数 5.0 が $numbers に含まれているか (厳密な型チェック) 78// 厳密なチェックでは 2 (int) は '2' (string) と異なるため false 79if (containsAny($searchNumbers1, $numbers, true)) { 80 echo "Case 5: 整数 2 または浮動小数点数 5.0 が数値配列に見つかりました。(厳密なチェック) (結果: true)" . PHP_EOL; 81} else { 82 echo "Case 5: 整数 2 も浮動小数点数 5.0 も数値配列に見つかりませんでした。(厳密なチェック) (結果: false)" . PHP_EOL; 83} 84 85// 例6: 整数 1 または整数 4 が $numbers に含まれているか (緩やかな型チェック) 86// 緩やかなチェックでは 4 (int) は 4.0 (float) と同等とみなされるため true 87if (containsAny($searchNumbers2, $numbers)) { 88 echo "Case 6: 整数 1 または整数 4 が数値配列に見つかりました。(緩やかなチェック) (結果: true)" . PHP_EOL; 89} else { 90 echo "Case 6: 整数 1 も整数 4 も数値配列に見つかりませんでした。(緩やかなチェック) (結果: false)" . PHP_EOL; 91} 92 93// 例7: 整数 1 または整数 4 が $numbers に含まれているか (厳密な型チェック) 94// 厳密なチェックでは 4 (int) は 4.0 (float) と異なるため false 95if (containsAny($searchNumbers2, $numbers, true)) { 96 echo "Case 7: 整数 1 または整数 4 が数値配列に見つかりました。(厳密なチェック) (結果: true)" . PHP_EOL; 97} else { 98 echo "Case 7: 整数 1 も整数 4 も数値配列に見つかりませんでした。(厳密なチェック) (結果: false)" . PHP_EOL; 99}
PHPのin_array関数は、指定された要素が配列の中に存在するかどうかを調べ、その結果を真偽値(trueまたはfalse)で返す基本的な関数です。第1引数には検索したい要素、第2引数には検索対象の配列を渡します。オプションの第3引数$strictをtrueにすると、要素の値だけでなくデータ型も厳密に比較します。
提供されたサンプルコードでは、このin_array関数を応用し、複数の要素のうち、いずれか一つでも配列に含まれているかをチェックするcontainsAny関数を実装しています。このカスタム関数は、検索したい複数の要素を配列として第1引数に受け取り、それら一つ一つについてin_array関数を使って検索対象の配列に存在するかを調べます。一つでも要素が見つかれば、すぐにtrueを返して処理を終了し、全ての要素を確認しても見つからなかった場合にfalseを返します。
containsAny関数も$strict引数に対応しており、in_arrayと同様に厳密な型チェックを行うかどうかを制御できます。例えば、緩やかな型チェックでは数値の4と浮動小数点数の4.0は同じと見なされますが、厳密な型チェックでは異なるものとして扱われます。この機能により、検索の柔軟性と正確性を状況に応じて使い分けることができます。
in_array関数は、配列内に特定の要素が存在するかを調べます。特に注意すべきは、第三引数$strictです。これがfalse(デフォルト)の場合、値が等しければ型が異なっても一致とみなされます。例えば、整数2と文字列'2'は同じと判断されます。しかし$strictをtrueにすると、値だけでなく型も厳密に一致する必要があります。この違いは数値と文字列の比較で特に間違いやすいため、意図しない挙動を避けるためには常に$strictの指定を意識してください。サンプルコードのcontainsAny関数は、複数の要素を検索する際にin_arrayを効率的に利用する応用例です。実務では、型まで厳密に比較したい場面が多いため、$strictをtrueに設定することを推奨いたします。
PHP in_arrayで連想配列の値を探す
1<?php 2 3/** 4 * in_array関数の使用例を示す関数です。 5 * 特に連想配列での値の検索方法を解説します。 6 * 7 * @return void 8 */ 9function demonstrateInArrayWithAssociativeArray(): void 10{ 11 // 連想配列の定義 12 $userProfile = [ 13 'id' => 101, 14 'username' => 'alice_dev', 15 'email' => 'alice@example.com', 16 'status' => 'active', 17 'age' => 30 18 ]; 19 20 echo "--- in_arrayの連想配列での値の検索例 ---\n"; 21 22 // 1. 連想配列に「値」が存在するかを検索 (デフォルトの非厳密モード) 23 // 値 'alice_dev' は 'username' キーの値として存在するため true 24 $searchValue1 = 'alice_dev'; 25 if (in_array($searchValue1, $userProfile)) { 26 echo "値 '{$searchValue1}' は配列に存在します。\n"; // この行が出力される 27 } else { 28 echo "値 '{$searchValue1}' は配列に存在しません。\n"; 29 } 30 31 // 2. 存在しない値を検索 32 // 値 'bob_dev' は配列に存在しないため false 33 $searchValue2 = 'bob_dev'; 34 if (in_array($searchValue2, $userProfile)) { 35 echo "値 '{$searchValue2}' は配列に存在します。\n"; 36 } else { 37 echo "値 '{$searchValue2}' は配列に存在しません。\n"; // この行が出力される 38 } 39 40 // 3. 厳密モード (bool $strict = true) で値を検索 41 // 'id' の値は整数型 (101) です。 42 // 検索値 '101' は文字列型のため、厳密モードでは見つかりません。 43 $searchValue3 = '101'; // 文字列型 44 if (in_array($searchValue3, $userProfile, true)) { 45 echo "厳密モード: 値 '{$searchValue3}' (文字列) は配列に存在します。\n"; 46 } else { 47 echo "厳密モード: 値 '{$searchValue3}' (文字列) は配列に存在しません。\n"; // この行が出力される 48 } 49 50 // 4. 厳密モードで型も一致する値を検索 51 // 検索値 101 は整数型で、配列の 'id' の値も整数型のため、厳密モードでも見つかります。 52 $searchValue4 = 101; // 整数型 53 if (in_array($searchValue4, $userProfile, true)) { 54 echo "厳密モード: 値 '{$searchValue4}' (整数) は配列に存在します。\n"; // この行が出力される 55 } else { 56 echo "厳密モード: 値 '{$searchValue4}' (整数) は配列に存在しません。\n"; 57 } 58 59 // 補足: in_array関数は、配列の「値」を検索します。 60 // キー(例: 'id', 'username')が存在するかを確認したい場合は、 61 // array_key_exists() 関数や isset() 関数を使用します。 62 // 例: in_array('id', $userProfile) は false を返します。 63} 64 65// 関数を実行して動作を確認します 66demonstrateInArrayWithAssociativeArray();
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_array と isset のパフォーマンス比較
1<?php 2 3/** 4 * 大規模な配列における in_array と isset のパフォーマンスを比較します。 5 * 6 * in_array()は配列を最初から順に検索するため、要素数が多い場合に遅くなる傾向があります。 7 * 一方、配列の値をキーに変換したハッシュマップ(連想配列)を用意し、 8 * isset()でキーの存在をチェックする方法は、非常に高速に動作します。 9 */ 10function compareInArrayAndIssetPerformance(): void 11{ 12 // 比較用の巨大な配列を生成 (0から999,999までの100万要素) 13 $largeHaystack = range(0, 999999); 14 $searchCount = 1000; 15 16 // 検索対象の値 (配列の最後尾に存在する) 17 $needle = 999999; 18 19 // --- 方法1: in_array() を使った検索 --- 20 $startTimeInArray = microtime(true); 21 22 for ($i = 0; $i < $searchCount; $i++) { 23 // 配列内に$needleが存在するかをチェック 24 in_array($needle, $largeHaystack, true); 25 } 26 27 $endTimeInArray = microtime(true); 28 $executionTimeInArray = $endTimeInArray - $startTimeInArray; 29 30 echo "--- in_array() performance ---" . PHP_EOL; 31 printf("Execution time for %d searches: %.6f seconds" . PHP_EOL, $searchCount, $executionTimeInArray); 32 echo PHP_EOL; 33 34 35 // --- 方法2: isset() を使った高速な検索 --- 36 37 // 事前に配列の値をキーに変換した検索用テーブルを作成 38 // この準備時間は、同じ配列に対して何度も検索を行う場合に償却されます。 39 $lookupTable = array_flip($largeHaystack); 40 41 $startTimeIsset = microtime(true); 42 43 for ($i = 0; $i < $searchCount; $i++) { 44 // 連想配列のキーとして$needleが存在するかをチェック 45 isset($lookupTable[$needle]); 46 } 47 48 $endTimeIsset = microtime(true); 49 $executionTimeIsset = $endTimeIsset - $startTimeIsset; 50 51 echo "--- isset() with a flipped array performance ---" . PHP_EOL; 52 printf("Execution time for %d searches: %.6f seconds" . PHP_EOL, $searchCount, $executionTimeIsset); 53 echo PHP_EOL; 54 55 // パフォーマンスの比較結果を表示 56 if ($executionTimeIsset > 0) { 57 printf("isset() is approximately %.2f times faster than in_array() in this case." . PHP_EOL, $executionTimeInArray / $executionTimeIsset); 58 } 59} 60 61// 関数を実行 62compareInArrayAndIssetPerformance();
in_array関数は、指定した配列の中に特定の値が存在するかどうかを調べるための関数です。第1引数 $needle に探したい値を、第2引数 $haystack に検索対象の配列を指定します。値が見つかれば true、見つからなければ false の真偽値を返します。オプションの第3引数 $strict に true を指定すると、値だけでなくデータ型も一致するかを厳密に比較します。
このサンプルコードは、in_array関数と、連想配列のキーの存在を調べる isset の実行速度を比較しています。in_arrayは配列の要素を先頭から一つずつ順番に調べるため、サンプルコードのような大規模な配列では検索に時間がかかる傾向があります。
一方、isset を用いる方法では、まず array_flip 関数で配列の「値」と「キー」を入れ替えた、検索用の新しい連想配列を作成します。isset を使ったキーの存在チェックは、配列の要素数にほとんど影響されず非常に高速に動作します。このコードは、巨大な配列に対して繰り返し検索を行うような処理では、事前に一手間加えて isset を利用する手法が in_array よりもはるかに高いパフォーマンスを発揮することを示しています。
サンプルコードは、大規模な配列で要素を検索する場合、in_arrayよりもarray_flipとissetを組み合わせる方が高速なことを示しています。ただし、この高速な手法には注意が必要です。array_flipは配列の値とキーを入れ替えるため、元の配列の値に重複があると、後の値で上書きされてしまい正しく検索できません。また、値がキーとして有効な文字列か整数でなければ利用できません。この方法は、値がユニークな配列に対して繰り返し検索を行う場合に特に有効です。in_array関数自体を使う際は、第三引数にtrueを指定するとデータ型まで比較する厳密な検索となり、予期せぬ不具合を防ぐために推奨されます。