【PHP8.x】array_key_exists()関数の使い方
array_key_exists関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
array_key_exists関数は、指定されたキーまたはインデックスが配列に存在するかどうかを確認する関数です。この関数は、配列の中に特定のキーが存在するかどうかを検証する必要がある場合に非常に役立ちます。array_key_exists関数は、キーが存在する場合にtrueを返し、存在しない場合にfalseを返します。
この関数は、isset()関数と似ていますが、isset()がキーが存在し、かつNULLでない場合にtrueを返すのに対し、array_key_exists()はキーが存在するだけでtrueを返します。つまり、配列の要素がNULLである場合でも、array_key_exists()はtrueを返します。
array_key_exists()関数の構文は array_key_exists(mixed $key, array $array): bool です。$key引数には検索するキーまたはインデックスを指定し、$array引数には検索対象の配列を指定します。$keyには文字列または整数を指定できます。
例えば、連想配列で特定のキーが存在するかどうかを確認する場合や、数値添字配列で特定のインデックスが存在するかどうかを確認する場合に使用できます。データベースから取得したデータに基づいて配列を作成し、特定のフィールドが存在するかどうかを検証する際などにも活用できます。array_key_exists()関数を使用することで、存在しないキーにアクセスするエラーを回避し、より堅牢なコードを作成することができます。
構文(syntax)
1array_key_exists(mixed $key, array $array): bool
引数(parameters)
string|int $key, array $array
- string|int $key: 検索したい配列のキーを指定します。文字列または整数を指定できます。
- array $array: キーが存在するかどうかを検索する対象の配列を指定します。
戻り値(return)
bool
指定されたキーが配列内に存在するかどうかを真偽値(trueまたはfalse)で返します。
サンプルコード
PHP配列キーの存在チェック(大文字・小文字区別なし)
1<?php 2 3/** 4 * 配列内に、大文字・小文字を区別せずに指定されたキーが存在するかどうかを確認します。 5 * 6 * PHPの array_key_exists 関数はキーの大文字・小文字を区別します。 7 * この関数は、検索対象の配列の文字列キーをすべて小文字に変換し、 8 * 検索キーも小文字に変換してから存在チェックを行うことで、 9 * 大文字・小文字を区別しないキーの存在確認を実現します。 10 * 数値キーは変換されず、そのまま比較されます。 11 * 12 * @param string|int $key 検索するキー(文字列または数値) 13 * @param array $array 検索対象の配列 14 * @return bool キーが存在すれば true、そうでなければ false を返します。 15 */ 16function array_key_exists_case_insensitive(string|int $key, array $array): bool 17{ 18 // array_change_key_case を使用して、配列のすべての文字列キーを小文字に変換します。 19 // 数値キーは array_change_key_case の影響を受けません。 20 $lowerCaseArrayKeys = array_change_key_case($array, CASE_LOWER); 21 22 // 検索するキーが文字列の場合、そのキーも小文字に変換します。 23 // 数値キーの場合は変換せず、そのまま使用します。 24 $searchKey = is_string($key) ? strtolower($key) : $key; 25 26 // 小文字に変換された配列のキーに対して、変換された検索キーが存在するかどうかを確認します。 27 return array_key_exists($searchKey, $lowerCaseArrayKeys); 28} 29 30// --- 使用例 --- 31 32// サンプルデータ配列 33$userSettings = [ 34 'UserName' => '初心者エンジニア', 35 'Email' => 'example@example.com', 36 'LANGUAGE' => 'Japanese', 37 123 => '数値キーの値' 38]; 39 40echo "--- 大文字・小文字を区別しないキーの存在チェック ---" . PHP_EOL; 41 42// 例1: キー 'username' が存在するかチェック (元のキーは 'UserName') 43$key1 = 'username'; 44if (array_key_exists_case_insensitive($key1, $userSettings)) { 45 echo "キー '{$key1}' は存在します。" . PHP_EOL; // 出力される 46} else { 47 echo "キー '{$key1}' は存在しません。" . PHP_EOL; 48} 49 50// 例2: キー 'LANGUAGE' が存在するかチェック (元のキーは 'LANGUAGE') 51$key2 = 'language'; 52if (array_key_exists_case_insensitive($key2, $userSettings)) { 53 echo "キー '{$key2}' は存在します。" . PHP_EOL; // 出力される 54} else { 55 echo "キー '{$key2}' は存在しません。" . PHP_EOL; 56} 57 58// 例3: 存在しない文字列キーをチェック 59$key3 = 'password'; 60if (array_key_exists_case_insensitive($key3, $userSettings)) { 61 echo "キー '{$key3}' は存在します。" . PHP_EOL; 62} else { 63 echo "キー '{$key3}' は存在しません。" . PHP_EOL; // 出力される 64} 65 66// 例4: 数値キーをチェック 67$key4 = 123; 68if (array_key_exists_case_insensitive($key4, $userSettings)) { 69 echo "キー '{$key4}' は存在します。" . PHP_EOL; // 出力される 70} else { 71 echo "キー '{$key4}' は存在しません。" . PHP_EOL; 72} 73 74// 例5: 存在しない数値キーをチェック 75$key5 = 456; 76if (array_key_exists_case_insensitive($key5, $userSettings)) { 77 echo "キー '{$key5}' は存在します。" . PHP_EOL; 78} else { 79 echo "キー '{$key5}' は存在しません。" . PHP_EOL; // 出力される 80} 81 82?>
PHPのarray_key_exists関数は、指定されたキーが配列内に存在するかどうかを確認するための標準機能です。しかし、この関数はデフォルトでキーの大文字・小文字を厳密に区別するため、例えば"name"と"Name"は異なるキーとして扱われます。
提供されたarray_key_exists_case_insensitive関数は、この大文字・小文字の区別なしにキーの存在をチェックできるように拡張したものです。この関数はまず、array_change_key_caseを使って検索対象の配列内のすべての文字列キーを小文字に変換します。次に、検索したい$keyが文字列であれば、これもstrtolowerで小文字に変換します。最終的に、小文字に変換された配列とキーに対してarray_key_existsを実行し、キーが存在するかどうかを判断します。数値キーに関しては大文字・小文字の区別がないため、この変換処理の影響を受けずにそのまま比較されます。
引数$keyには、配列内で探したいキーを文字列または数値で指定します。引数$arrayには、検索対象となる配列を渡します。戻り値はブール値で、キーが見つかった場合はtrue、見つからなかった場合はfalseが返されます。これにより、様々なケースで柔軟にキーの存在を確認できるようになります。
このサンプルコードで示されている関数は、PHPの標準であるarray_key_existsがキーの大文字・小文字を区別するのに対し、文字列キーに対して大文字・小文字を区別しない検索を可能にします。ただし、これは内部で検索対象の配列のキーを全て小文字に変換した新しい配列を一時的に作成して確認するため、元の配列は変更されません。また、この変換処理は文字列キーのみに適用され、数値キーはそのまま厳密に比較される点にご注意ください。特に大きな配列に対してこの関数を頻繁に利用する場合、配列のコピーとキー変換のオーバーヘッドにより、パフォーマンスに影響が出る可能性があるので、用途とデータ量を考慮して利用することが重要です。
PHP: array_key_existsとissetの違いを比較する
1<?php 2 3/** 4 * array_key_exists() と isset() の挙動の違いを比較します。 5 * 6 * array_key_exists() は、配列内に指定したキーが存在するかどうかを純粋にチェックします。 7 * 一方、isset() は、キーが存在し、かつその値が null でない場合にのみ true を返します。 8 * この違いは、キーは存在するが値が null の場合に顕著になります。 9 */ 10function compareKeyCheckFunctions(): void 11{ 12 // テスト用の配列データ 13 // 'name' キーは存在するが、値は null 14 $data = [ 15 'id' => 123, 16 'name' => null, 17 ]; 18 19 echo 'チェック対象の配列:' . PHP_EOL; 20 print_r($data); 21 echo PHP_EOL; 22 23 // --- ケース1: キーが存在し、値が null の場合 ('name') --- 24 $key_with_null = 'name'; 25 26 // array_key_exists() はキーの存在のみを見るため true を返す 27 if (array_key_exists($key_with_null, $data)) { 28 echo "[array_key_exists] キー '{$key_with_null}' は存在します。" . PHP_EOL; 29 } else { 30 echo "[array_key_exists] キー '{$key_with_null}' は存在しません。" . PHP_EOL; 31 } 32 33 // isset() は値が null のため false を返す 34 if (isset($data[$key_with_null])) { 35 echo "[isset] キー '{$key_with_null}' はセットされています。" . PHP_EOL; 36 } else { 37 echo "[isset] キー '{$key_with_null}' はセットされていません (値がnullのため)。" . PHP_EOL; 38 } 39 40 echo '---' . PHP_EOL; 41 42 // --- ケース2: キーが存在しない場合 ('age') --- 43 $non_existent_key = 'age'; 44 45 // どちらの関数もキーが存在しないため false を返す 46 if (array_key_exists($non_existent_key, $data)) { 47 echo "[array_key_exists] キー '{$non_existent_key}' は存在します。" . PHP_EOL; 48 } else { 49 echo "[array_key_exists] キー '{$non_existent_key}' は存在しません。" . PHP_EOL; 50 } 51 52 if (isset($data[$non_existent_key])) { 53 echo "[isset] キー '{$non_existent_key}' はセットされています。" . PHP_EOL; 54 } else { 55 echo "[isset] キー '{$non_existent_key}' はセットされていません。" . PHP_EOL; 56 } 57} 58 59// 関数を実行して結果を表示 60compareKeyCheckFunctions();
PHPのarray_key_exists()関数は、配列の中に指定したキーが存在するかどうかを調べるための関数です。第1引数に調べたいキー(文字列または整数)、第2引数に対象となる配列を渡します。戻り値は真偽値(bool)であり、キーが存在すればtrue、存在しなければfalseを返します。
この関数としばしば比較されるものにisset()がありますが、両者の挙動には重要な違いがあります。それは、キーに対応する値がnullの場合の扱いです。array_key_exists()はキーの存在そのものをチェックするため、値がnullであってもキーが存在すればtrueを返します。対してisset()は、キーが存在し、かつその値がnullではない場合にのみtrueを返します。
サンプルコードでは、値がnullの'name'キーをチェックしています。この場合、array_key_exists()はtrueを返しますが、isset()は値がnullのためfalseを返します。一方で、存在しない'age'キーに対しては、どちらもfalseを返します。このように、値がnullのキーの存在を明確に確認したい場面でarray_key_exists()は有効です。
array_key_exists()は、指定したキーが配列に存在するかどうかだけを判定します。一方、isset()はキーが存在し、かつその値がnullでない場合にのみtrueを返します。このため、サンプルコードの'name' => nullのように、キーは存在するが値がnullの場合に両者の結果が異なります。意図的にnullを値として許容する配列で、キーの存在そのものを厳密に確認したい場合はarray_key_exists()を使用してください。値がnullでないことを確認して安全に処理を進めたい場合はisset()が適しています。一般的にisset()の方が高速に動作するため、null値を考慮する必要がない場合はisset()の使用が推奨されます。
PHP多次元配列のキー存在チェック
1<?php 2 3/** 4 * 多次元配列内で指定されたキーパスが存在するかどうかをチェックする関数。 5 * 6 * この関数は、`array_key_exists` を使用して、配列の各階層にわたってキーの存在を確認します。 7 * キーのパスは配列で指定し、各要素が次の階層のキーを示します。 8 * `array_key_exists` の特性により、キーが存在し、その値が `null` であっても `true` を返します。 9 * 10 * @param array $array 検索対象の多次元配列。 11 * @param array $keys_path 検索するキーのパスを要素とする配列(例: ['level1_key', 'level2_key'])。 12 * @return bool キーパスがすべて存在し、最終的な値に到達できる場合は true、それ以外は false。 13 */ 14function checkMultidimensionalArrayKeyExists(array $array, array $keys_path): bool 15{ 16 $current_array = $array; 17 18 // キーパスの各階層を順に辿る 19 foreach ($keys_path as $key) { 20 // 現在の要素が配列であり、かつ次のキーが存在するかをチェック 21 // スカラー値に対して array_key_exists を呼び出すとエラーになるため、is_array() で確認 22 if (is_array($current_array) && array_key_exists($key, $current_array)) { 23 // 次の階層の配列または値に更新 24 $current_array = $current_array[$key]; 25 } else { 26 // キーが存在しない、または現在の要素が配列でない場合は false を返す 27 return false; 28 } 29 } 30 31 // 全てのキーパスを正常に辿れた場合、またはキーパスが空の場合は true を返す 32 return true; 33} 34 35// ---------------------------------------------------- 36// 以下、`checkMultidimensionalArrayKeyExists` 関数の使用例 37// ---------------------------------------------------- 38 39// サンプルデータとして多次元配列を定義 40$data = [ 41 'users' => [ 42 [ 43 'id' => 1, 44 'name' => 'Alice', 45 'details' => [ 46 'email' => 'alice@example.com', 47 'age' => 30, 48 ], 49 'status' => null, // 値が null のキーも array_key_exists は true を返す 50 ], 51 [ 52 'id' => 2, 53 'name' => 'Bob', 54 'details' => [ 55 'email' => 'bob@example.com', 56 'age' => 25, 57 ], 58 ], 59 ], 60 'products' => [ 61 'apple' => [ 62 'price' => 100, 63 'stock' => 50, 64 ], 65 ], 66]; 67 68// 存在するキーパスの例 69$path_existing_1 = ['users', 0, 'name']; 70checkMultidimensionalArrayKeyExists($data, $path_existing_1); // 期待される結果: true 71 72$path_existing_2 = ['users', 0, 'details', 'email']; 73checkMultidimensionalArrayKeyExists($data, $path_existing_2); // 期待される結果: true 74 75$path_existing_3 = ['users', 0, 'status']; // キーは存在し、値が null 76checkMultidimensionalArrayKeyExists($data, $path_existing_3); // 期待される結果: true 77 78$path_existing_4 = ['products', 'apple', 'price']; 79checkMultidimensionalArrayKeyExists($data, $path_existing_4); // 期待される結果: true 80 81// 存在しないキーパスの例 82$path_non_existing_1 = ['users', 0, 'address']; // 存在しないキー 83checkMultidimensionalArrayKeyExists($data, $path_non_existing_1); // 期待される結果: false 84 85$path_non_existing_2 = ['users', 2, 'name']; // 存在しないインデックス 86checkMultidimensionalArrayKeyExists($data, $path_non_existing_2); // 期待される結果: false 87 88$path_non_existing_3 = ['users', 0, 'details', 'phone']; // 深い階層で存在しないキー 89checkMultidimensionalArrayKeyExists($data, $path_non_existing_3); // 期待される結果: false 90 91$path_non_existing_4 = ['orders', 0, 'id']; // 最上位階層で存在しないキー 92checkMultidimensionalArrayKeyExists($data, $path_non_existing_4); // 期待される結果: false 93 94// 特殊なケース: キーパスが空の場合 95$path_empty = []; 96checkMultidimensionalArrayKeyExists($data, $path_empty); // 期待される結果: true (空パスは常に存在とみなす) 97 98// 特殊なケース: 中間階層が配列ではなくスカラー値の場合 99$path_scalar_intermediate = ['users', 0, 'name', 'first_char']; // 'name'は文字列なので、その下にキーは存在しない 100checkMultidimensionalArrayKeyExists($data, $path_scalar_intermediate); // 期待される結果: false
PHPのarray_key_exists関数は、指定されたキーが配列に存在するかどうかを確認する際に使用します。この関数は、第一引数に検索したいキー(文字列または整数)、第二引数に検索対象の配列を受け取り、キーが存在すればtrue、存在しなければfalseを真偽値で返します。特に、配列のキーが存在し、その値がnullの場合でもtrueを返す点が特徴です。
提示されたサンプルコードでは、このarray_key_exists関数を応用し、多次元配列の奥深くにあるキーパス全体が存在するかどうかをチェックするcheckMultidimensionalArrayKeyExists関数が定義されています。この関数は、検索対象の多次元配列と、検索したいキーの階層を順に指定した配列(キーパス)を引数として受け取ります。そして、キーパスの各要素を順番に辿り、それぞれの階層でarray_key_existsとis_array関数を組み合わせてキーの存在と値が配列であるかを確認します。これにより、途中の階層でキーが存在しなかったり、配列ではない値にアクセスしようとしたりする場合にはfalseを返します。すべてのキーパスを正常に辿り着けた場合にのみtrueを返します。例えば、['users', 0, 'name']のようなパスで、users配列の0番目の要素のnameキーが存在するかを効率的に判定できます。
このサンプルコードで使われているarray_key_exists関数は、配列内に指定したキーが存在すれば、その値がnullであってもtrueを返します。isset()関数とはこの点が異なるため、キーの有無だけを厳密にチェックしたい場合に利用しますが、混同しないよう注意が必要です。
多次元配列のキーパスを確認する際は、途中の各階層が必ず配列であること、そしてその配列内に次のキーが存在することの両方を順にチェックすることが重要です。途中の階層が配列ではなく文字列などのスカラー値であった場合、その先にキーは存在しませんので、本コードのようにis_array()で事前に確認し、安全にfalseを返すように実装してください。これにより、未定義のオフセットへのアクセスなどによるエラーを防ぎ、堅牢なコードになります。
PHP array_key_exists でキーの存在をチェックする
1<?php 2 3/** 4 * array_key_exists の使い方を示すサンプルコードです。 5 * 6 * array_key_exists 関数は、配列内に特定のキーが存在するかどうかをチェックします。 7 * キーに対応する値が null であっても、キーが存在すれば true を返します。 8 * 9 * 【キーワード「非推奨」について】 10 * array_key_exists 関数自体はPHP 8において非推奨ではありません。 11 * ただし、キーが存在し、かつその値が null でないことを確認したい場合は、 12 * isset() 関数を使用する方が一般的です。isset() は、キーが存在しないか、 13 * または値が null の場合に false を返します。 14 * どちらを使用するかは、あなたのコードが「キーの存在のみ」を確認したいのか、 15 * それとも「キーが存在し、かつ値が null でないこと」を確認したいのかによって選択します。 16 */ 17function demonstrateArrayKeyExistsUsage(): void 18{ 19 // サンプル配列を定義 20 $data = [ 21 'user_id' => 101, 22 'username' => 'php_user', 23 'email' => null, // キーは存在するが値は null 24 0 => 'first_element' 25 ]; 26 27 echo "--- array_key_exists の基本的な使用例 ---\n"; 28 29 // 存在するキー 'username' の確認 30 if (array_key_exists('username', $data)) { 31 echo "✅ 'username' キーは存在します。\n"; 32 } else { 33 echo "❌ 'username' キーは存在しません。\n"; 34 } 35 36 // 値が null のキー 'email' の確認 37 if (array_key_exists('email', $data)) { 38 echo "✅ 'email' キーは存在します (値は null)。\n"; 39 } else { 40 echo "❌ 'email' キーは存在しません。\n"; 41 } 42 43 // 存在しないキー 'password' の確認 44 if (array_key_exists('password', $data)) { 45 echo "✅ 'password' キーは存在します。\n"; 46 } else { 47 echo "❌ 'password' キーは存在しません。\n"; 48 } 49 50 // 数値キー 0 の確認 51 if (array_key_exists(0, $data)) { 52 echo "✅ 数値キー '0' は存在します。\n"; 53 } else { 54 echo "❌ 数値キー '0' は存在しません。\n"; 55 } 56 57 echo "\n--- array_key_exists と isset() の違い ---\n"; 58 59 // キー 'email' (値が null) での違い 60 echo "キー 'email' (値は null):\n"; 61 echo " array_key_exists('email', \$data) の結果: " . (array_key_exists('email', $data) ? 'true' : 'false') . "\n"; 62 echo " isset(\$data['email']) の結果: " . (isset($data['email']) ? 'true' : 'false') . "\n"; 63 64 // キー 'user_id' (値が存在) での違い 65 echo "\nキー 'user_id' (値は 101):\n"; 66 echo " array_key_exists('user_id', \$data) の結果: " . (array_key_exists('user_id', $data) ? 'true' : 'false') . "\n"; 67 echo " isset(\$data['user_id']) の結果: " . (isset($data['user_id']) ? 'true' : 'false') . "\n"; 68 69 // 存在しないキー 'phone' での違い 70 echo "\n存在しないキー 'phone':\n"; 71 echo " array_key_exists('phone', \$data) の結果: " . (array_key_exists('phone', $data) ? 'true' : 'false') . "\n"; 72 echo " isset(\$data['phone']) の結果: " . (isset($data['phone']) ? 'true' : 'false') . "\n"; 73} 74 75// 関数を実行 76demonstrateArrayKeyExistsUsage();
array_key_exists関数は、指定した配列の中に、特定のキーが存在するかどうかを確認するためのPHP関数です。第一引数に確認したいキー(文字列または整数)、第二引数に対象となる配列を指定します。指定したキーが配列内に存在すればtrueを、存在しなければfalseを返します。
この関数の重要な特徴は、キーに対応する値がnullであっても、キー自体が存在すればtrueを返す点です。サンプルコードでは、値がnullである'email'キーを確認した際にtrueが返されることで、この挙動を示しています。これは、キーが存在しない場合や値がnullの場合にfalseを返すisset()との大きな違いです。
array_key_exists関数自体は非推奨ではありませんが、isset()と適切に使い分けることが重要です。「キーの存在そのもの」を厳密にチェックしたい場合にこの関数を使用し、「キーが存在し、かつ値がnullでないこと」を確認したい場合はisset()を使用するのが一般的です。
array_key_exists関数は、キーに対応する値がnullであっても、キー自体が存在すればtrueを返します。これが、isset()との最も大きな違いです。isset()はキーが存在しない場合だけでなく、値がnullの場合もfalseを返すため注意が必要です。
したがって、「キーの存在そのもの」を厳密に確認したい場合にこの関数を使用します。例えば、フォームから送信されたデータに特定の項目が含まれているか(値が空でも)をチェックする際に便利です。一方、「キーが存在し、かつ有効な値がセットされていること」を確認したい場合はisset()を使うのが一般的です。この違いを理解し、目的に応じて正しく使い分けることが重要です。引数の順序が (キー, 配列) である点も忘れないようにしましょう。