【PHP8.x】array_keys関数の使い方
array_keys関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『array_keys関数は、配列に含まれる全てのキー、または指定した値に対応するキーを取得し、それらを要素とする新しい配列を返す関数です。この関数は、第一引数に与えられた配列からキーのみを抽出するために使用されます。第二引数に特定の値を指定すると、配列の中からその値を持つ要素を検索し、対応するキーだけを返します。これにより、ある値がどのキーに関連付けられているかを効率的に調べることが可能です。さらに、第三引数にブール値の true を指定すると、第二引数の値と配列の要素の値を、データ型まで完全に一致するかどうかを判定する厳密な比較を行います。この引数を省略、または false を指定した場合は、データ型を考慮しない緩やかな比較が行われます。返される値は常に、抽出されたキーを要素として持つ新しい配列であり、元の配列のキーが整数であれば整数、文字列であれば文字列として格納されます。この関数は、配列の構造を把握したり、特定の値を持つキーをまとめて取得したい場合に役立ちます。』
構文(syntax)
1array_keys(array $array, mixed $search_value = null, bool $strict = false): array
引数(parameters)
array $array, mixed $filter_value = null, bool $strict = false
- array $array: キーを取得したい配列
- mixed $filter_value = null: 特定の値を持つ要素のキーのみを取得する場合に、その値。指定しない場合は全てのキーを取得
- bool $strict = false: $filter_value との比較を厳密に行うかどうかの真偽値
戻り値(return)
list<int|string>
指定された配列からキーのみを抽出した新しい配列を返します。キーは数値または文字列のいずれかです。
サンプルコード
PHP多次元配列のキーを抽出する
1<?php 2 3/** 4 * 多次元配列から特定のキーを抽出するサンプル 5 */ 6function extractKeysFromMultidimensionalArray(array $array, mixed $filter_value = null, bool $strict = false): array 7{ 8 $result = []; 9 10 foreach ($array as $key => $value) { 11 // フィルタ値が指定されている場合、値を比較 12 if ($filter_value !== null) { 13 if ($strict) { 14 if ($value === $filter_value) { 15 $result[] = $key; 16 } 17 } else { 18 if ($value == $filter_value) { 19 $result[] = $key; 20 } 21 } 22 } else { 23 $result[] = $key; 24 } 25 26 // 値が配列の場合、再帰的に処理 27 if (is_array($value)) { 28 $nestedKeys = extractKeysFromMultidimensionalArray($value, $filter_value, $strict); 29 $result = array_merge($result, $nestedKeys); 30 } 31 } 32 33 return $result; 34} 35 36// サンプルデータ 37$multidimensionalArray = [ 38 'name' => 'John Doe', 39 'age' => 30, 40 'address' => [ 41 'street' => '123 Main St', 42 'city' => 'Anytown', 43 'zip' => '12345', 44 ], 45 'hobbies' => ['reading', 'hiking', 'coding'], 46 'status' => true 47]; 48 49// 全てのキーを取得 50$allKeys = extractKeysFromMultidimensionalArray($multidimensionalArray); 51echo "全てのキー:\n"; 52print_r($allKeys); 53 54// 'reading'という値を持つキーを取得 (厳密な比較なし) 55$filteredKeys = extractKeysFromMultidimensionalArray($multidimensionalArray, 'reading'); 56echo "\n値が'reading'のキー:\n"; 57print_r($filteredKeys); 58 59// 'true'という値を持つキーを取得 (厳密な比較) 60$filteredStrictKeys = extractKeysFromMultidimensionalArray($multidimensionalArray, true, true); 61echo "\n値が'true'のキー (厳密な比較):\n"; 62print_r($filteredStrictKeys);
PHPのarray_keys関数は、配列からキーを取得するために使用します。このサンプルコードでは、多次元配列から特定のキーを抽出するextractKeysFromMultidimensionalArray関数を実装し、array_keysの応用例を示しています。
extractKeysFromMultidimensionalArray関数は、引数として配列 $array、フィルタ値 $filter_value(オプション)、厳密な比較を行うかどうかを示す $strict(オプション)を受け取ります。この関数は、配列を再帰的に処理し、指定されたフィルタ値に基づいてキーを抽出します。
$filter_valueが指定された場合、配列の値がこの値と一致するキーのみが結果に追加されます。$strictがtrueの場合、値の比較は厳密に行われ(===を使用)、型まで一致する必要があります。$strictがfalseの場合、通常の比較演算子(==)が使用されます。
サンプルコードでは、まずサンプルとなる多次元配列 $multidimensionalArray を定義しています。次に、extractKeysFromMultidimensionalArray関数を使用して、配列の全てのキー、値が'reading'であるキー、そして値がtrueであるキー(厳密な比較)をそれぞれ取得し、結果を出力しています。
このサンプルは、array_keys関数が直接多次元配列を扱えないため、再帰的な関数を使って多次元配列に対応する方法を示しています。array_keys単体では実現できない、より複雑な条件でのキー抽出を可能にするテクニックです。この例を通じて、配列操作におけるarray_keysの応用範囲を理解することができます。
array_keys関数は、指定した配列のキーを返しますが、多次元配列には直接対応していません。サンプルコードは、再帰関数を用いて多次元配列に対応しています。
$filter_valueを指定すると、その値と一致する値に対応するキーのみが抽出されます。$strictをtrueに設定すると、型の厳密な比較(===)が行われます。falseの場合は、型の緩やかな比較(==)が行われるため、意図しない結果になる可能性があることに注意してください。
多次元配列を扱う場合、再帰処理の深さに注意が必要です。配列の構造によっては、処理が重くなる可能性があります。また、array_mergeを使用しているため、大規模な配列ではメモリ消費量が増加する可能性があります。状況に応じて、より効率的な実装を検討してください。
PHP: array_keysで多次元配列からキーを検索する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 多次元配列から、指定したキーの値が特定の値と一致する要素のキーを検索します。 7 * 8 * array_keys() は一次元配列に対して機能するため、多次元配列を直接操作できません。 9 * そこで、array_column() と組み合わせて、実用的な検索を実現します。 10 * 11 * @return void 12 */ 13function find_keys_in_multidimensional_array(): void 14{ 15 // サンプルデータ: ユーザー情報の多次元配列 16 $users = [ 17 // キー 'user_a' 18 'user_a' => ['id' => 101, 'name' => 'Alice', 'role' => 'editor'], 19 // キー 'user_b' 20 'user_b' => ['id' => 102, 'name' => 'Bob', 'role' => 'admin'], 21 // キー 'user_c' 22 'user_c' => ['id' => 103, 'name' => 'Charlie', 'role' => 'viewer'], 23 // キー 'user_d' 24 'user_d' => ['id' => 104, 'name' => 'Dave', 'role' => 'editor'], 25 ]; 26 27 // STEP 1: array_column() を使い、子配列の 'role' の値だけを抽出した新しい配列を作成します。 28 // この時、元の配列のキー ('user_a', 'user_b'...) が維持されます。 29 // 30 // $roles の中身: 31 // [ 32 // 'user_a' => 'editor', 33 // 'user_b' => 'admin', 34 // 'user_c' => 'viewer', 35 // 'user_d' => 'editor', 36 // ] 37 $roles = array_column($users, 'role', null); 38 39 // STEP 2: array_keys() を使い、STEP 1 で作成した配列から、 40 // 値が 'editor' である要素のキーを検索します。 41 $editorKeys = array_keys($roles, 'editor'); 42 43 // 結果の出力 44 echo "役割(role)が 'editor' のユーザーのキー:\n"; 45 print_r($editorKeys); 46 // 期待される出力: 47 // 役割(role)が 'editor' のユーザーのキー: 48 // Array 49 // ( 50 // [0] => user_a 51 // [1] => user_d 52 // ) 53} 54 55// 関数を実行して結果を確認します。 56find_keys_in_multidimensional_array();
array_keys()は、配列から全てのキー、または指定した値に一致する要素のキーを配列として取得するPHPの関数です。第一引数に対象の配列、オプションの第二引数に検索したい値を指定します。戻り値は、見つかったキーのリスト(PHP 8.1以降の型表記)です。
このサンプルコードは、array_keys()が通常は一次元配列に対して使われる関数であるため、多次元配列を扱う際の実用的なテクニックを示しています。ここでは、ユーザー情報の多次元配列$usersの中から、特定の役割(role)を持つユーザーのキーを検索します。
まずarray_column()関数を使い、多次元配列$usersから各要素の'role'の値だけを抽出します。このとき、array_column()の第三引数をnullに指定することで、元の配列のキー('user_a'や'user_b'など)を維持したまま、新しい一次元配列$rolesを生成します。
次に、この生成された一次元配列$rolesに対してarray_keys()を実行します。第二引数に'editor'を指定することで、値が'editor'である要素のキー、すなわち'user_a'と'user_d'を配列として取得しています。このように2つの関数を組み合わせることで、多次元配列に対する複雑な検索を簡潔に実現できます。
array_keys()は多次元配列を直接検索できず、一次元配列にのみ機能します。そのためサンプルコードでは、最初にarray_column()を使って多次元配列から特定の値('role')だけを抜き出し、一次元の配列に変換しています。このとき、array_column()の第3引数にnullを指定することで、元のキー('user_a'など)を維持している点が重要です。もしnullを指定しないと、キーは0から始まる数値に置き換わってしまいます。また、array_keys()はデフォルトでは型を考慮しない緩やかな比較で値を検索します。データ型まで厳密に一致させたい場合は、第3引数にtrueを指定する必要があります。
PHPで連想配列のキーを取得する
1<?php 2 3/** 4 * array_keys() を使って連想配列のキーを取得するサンプルコード 5 */ 6 7// 社員情報を格納する連想配列を定義します。 8// キーが社員ID (string)、値が役割 (string) となっています。 9$employeeRoles = [ 10 'emp001' => 'developer', 11 'emp002' => 'designer', 12 'emp003' => 'developer', 13 'mgr001' => 'manager', 14]; 15 16// --- ケース1: 連想配列のすべてのキーを取得する --- 17 18// array_keys() を使用して、$employeeRoles 配列からすべてのキーを取得します。 19// 戻り値は、キーを値として持つ新しい配列です。 20$allKeys = array_keys($employeeRoles); 21 22echo "■ すべての社員ID:" . PHP_EOL; 23print_r($allKeys); 24/* 25出力結果: 26Array 27( 28 [0] => emp001 29 [1] => emp002 30 [2] => emp003 31 [3] => mgr001 32) 33*/ 34 35echo PHP_EOL; 36 37// --- ケース2: 特定の値を持つキーのみを絞り込んで取得する --- 38 39// array_keys() の第2引数に 'developer' を指定します。 40// これにより、値が 'developer' である要素のキーのみが配列として返されます。 41$developerKeys = array_keys($employeeRoles, 'developer'); 42 43echo "■ 役割が 'developer' の社員ID:" . PHP_EOL; 44print_r($developerKeys); 45/* 46出力結果: 47Array 48( 49 [0] => emp001 50 [1] => emp003 51) 52*/ 53
PHPのarray_keys()は、連想配列や配列から、すべてのキーまたは特定の値に一致するキーを取得するための関数です。
この関数は、第1引数に対象となる配列を指定します。引数が1つだけの場合、その配列に含まれるすべてのキーを抽出し、それらを値として持つ新しい配列を返します。サンプルコードのケース1では、社員情報を格納した$employeeRoles配列から、すべてのキー、つまり全社員のIDを取得しています。
さらに、第2引数に特定の値を指定すると、元の配列の中からその値を持つ要素だけを検索し、対応するキーのみを返します。ケース2では、第2引数に 'developer' を指定しているため、値が 'developer' である要素のキー 'emp001' と 'emp003' だけが抽出されています。
戻り値は、取得したキーを要素とする新しい配列です。元のキーが文字列や整数であっても、返される配列のキーは0から始まる数値インデックスになります。なお、第3引数で型まで含めた厳密な値の比較を行うかどうかも指定できます。
array_keys関数が返す配列は、元のキーを「値」として持ち、キーは0から始まる連番に振り直される点に注意が必要です。元の配列のキー構造は維持されません。第2引数で値を指定してキーを絞り込む際、デフォルトの比較は == と同じ緩やかな比較です。例えば 0 と false を区別したい場合は、第3引数に true を指定し、型まで一致するかを判定する厳密な比較(===)を行う必要があります。これにより、予期しない値が一致することを防ぎ、より安全なコードになります。対象の配列が空の場合、この関数はエラーにならず空の配列を返します。