【PHP8.x】array_diff_key関数の使い方
array_diff_key関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『array_diff_key関数は、キーに基づいて配列の差を計算し、最初の配列にのみ存在するキーを持つ要素を抽出する関数です。この関数は、第一引数に指定した配列を基準とし、第二引数以降に指定した一つ以上の配列と比較を行います。比較の際にはキーのみが使用され、各キーに対応する値は比較の対象にはなりません。具体的には、第一引数の配列に含まれるキーが、第二引数以降のどの配列にも存在しない場合に、そのキーとそれに対応する値のペアが結果の配列に含まれます。この処理の結果として、差分を格納した新しい配列が返されます。元の引数として渡した配列が変更されることはありません。この関数は、複数の設定配列を比較して、特定の配列にだけ存在する設定項目を洗い出すような場面で役立ちます。キーの比較は、型までを厳密に評価するのではなく、通常の比較演算子と同様の方法で行われる点に注意が必要です。
構文(syntax)
1<?php 2 3$array1 = ['color1' => 'red', 'color2' => 'green', 'color3' => 'blue']; 4$array2 = ['color1' => 'orange', 'color4' => 'purple']; 5 6$result = array_diff_key($array1, $array2); 7 8print_r($result); 9 10?>
引数(parameters)
array $array, array ...$arrays
- array $array: 比較対象となる配列
- array ...$arrays: 比較元の配列(複数指定可能)
戻り値(return)
array
第一引数で指定された配列から、第二引数以降で指定された配列のキーと一致するキーを持つ要素を除外した新しい配列を返します。
サンプルコード
PHP array_diff_keyでキー差分を取得する
1<?php 2 3/** 4 * array_diff_key関数の使用例。 5 * 6 * 複数の配列間でキーを比較し、最初の配列にのみ存在するキーを持つ要素を返します。 7 * 'multidimensional'キーワードを考慮し、配列の値がネストされた配列である場合も示しますが、 8 * array_diff_key自体はトップレベルのキーのみを比較することに注意してください。 9 * 10 * @return void 11 */ 12function demonstrateArrayDiffKey(): void 13{ 14 // 最初の配列 (比較元) 15 $baseArray = [ 16 'id' => 1, 17 'name' => 'Alice', 18 'details' => [ 19 'age' => 30, 20 'city' => 'New York', 21 ], 22 'status' => 'active', 23 ]; 24 25 // 2番目の配列 (比較対象1) 26 // 'id'と'name'のキーが$baseArrayと共通 27 $compareArray1 = [ 28 'id' => 101, 29 'name' => 'Bob', 30 'roles' => ['admin', 'editor'], 31 ]; 32 33 // 3番目の配列 (比較対象2) 34 // 'status'のキーが$baseArrayと共通 35 $compareArray2 = [ 36 'status' => 'pending', 37 'createdAt' => '2023-01-01', 38 ]; 39 40 echo "--- 元の配列一覧 ---\n"; 41 echo "Base Array:\n"; 42 echo json_encode($baseArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n"; 43 echo "Compare Array 1:\n"; 44 echo json_encode($compareArray1, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n"; 45 echo "Compare Array 2:\n"; 46 echo json_encode($compareArray2, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n"; 47 48 // array_diff_keyの実行 49 // $baseArrayのキーのうち、$compareArray1と$compareArray2のどちらにも存在しないキーを持つ要素を抽出します。 50 // 51 // - 'id' は $compareArray1 に存在するため除外されます。 52 // - 'name' は $compareArray1 に存在するため除外されます。 53 // - 'details' は他のどの配列にもキーとして存在しないため残ります。 54 // - 'status' は $compareArray2 に存在するため除外されます。 55 $result = array_diff_key($baseArray, $compareArray1, $compareArray2); 56 57 echo "--- array_diff_keyの結果 ---\n"; 58 echo "Base Array から Compare Array 1 と Compare Array 2 のキーを除いたもの:\n"; 59 echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n"; 60} 61 62// 関数を実行して結果を表示 63demonstrateArrayDiffKey(); 64
PHPのarray_diff_key関数は、複数の配列を比較し、最初の配列に「のみ」存在するキーとその値のペアを抽出して新しい配列として返す機能を提供します。
この関数は、最初の引数である $array を基準とし、続く ...$arrays に指定された一つ以上の配列のキーと比較します。最初の引数 $array は比較元の配列であり、...$arrays は比較対象となる配列群です。戻り値は、比較元の配列 $array のうち、比較対象のどの配列にもそのキーが存在しない要素だけを抜き出した配列となります。
提供されたサンプルコードでは、$baseArray から $compareArray1 と $compareArray2 のキーを引いています。具体的には、$baseArray に存在する 'id', 'name', 'status' のキーは、それぞれ $compareArray1 や $compareArray2 にも存在するため、結果の配列からは除外されます。一方で、'details' というキーは他のどの比較対象配列にも存在しないため、その値であるネストされた配列ごと結果に残ります。このことからわかるように、array_diff_keyは配列の値がたとえ別の配列(多次元配列の一部)であっても、トップレベルのキーのみを比較し、値の構造には影響を与えません。これにより、特定のキーを持つデータだけを効率的に取り除くことができます。
array_diff_key関数は、配列の「キー」だけを比較し、最初の配列にのみ存在するキーを持つ要素を返します。最も重要な注意点は、この関数が比較するのは配列の「トップレベルのキー」のみであるという点です。たとえ値がネストされた多次元配列であっても、その内部のキーまでは比較対象としません。サンプルコードのdetailsキーが結果に残っているのはこのためです。また、すべての引数が配列である必要がありますので、型に注意して利用してください。
PHP array_diff_keyで配列のキーを比較する
1<?php 2 3/** 4 * array_diff_key関数の使用例 5 * 複数の配列のキーを比較し、最初の配列にのみ存在するキーを持つ要素を返します。 6 * 値は比較されず、キーのみが考慮されます。 7 * 8 * システムエンジニアを目指す初心者向けに、array_diff_keyの基本的な動作を示します。 9 */ 10 11// 比較する最初の配列を定義します。 12// この配列から、他の配列と共通のキーを持つ要素が除外されます。 13$array1 = [ 14 'product_id' => 101, 15 'product_name' => 'Laptop', 16 'price' => 1200, 17 'quantity' => 50, 18 'status' => 'available', 19]; 20 21// 比較対象となる追加の配列を定義します。 22// これらの配列のキーが$array1から除外される対象となります。 23$array2 = [ 24 'product_name' => 'Desktop', // キー 'product_name' は$array1から除外されます。 25 'price' => 800, // キー 'price' は$array1から除外されます。 26 'category' => 'Electronics', 27]; 28 29$array3 = [ 30 'quantity' => 10, // キー 'quantity' は$array1から除外されます。 31 'manufacturer' => 'ABC Inc.', 32 'product_id' => 202, // キー 'product_id' は$array1から除外されます。 33]; 34 35echo "--- 元の配列 ---" . PHP_EOL; 36echo "配列1: " . PHP_EOL; 37print_r($array1); 38echo "配列2: " . PHP_EOL; 39print_r($array2); 40echo "配列3: " . PHP_EOL; 41print_r($array3); 42 43// 例1: array_diff_key関数を使用して、$array1と$array2のキーを比較します。 44// $array1に存在し、$array2に存在しないキーを持つ要素が返されます。 45$result1 = array_diff_key($array1, $array2); 46echo "--- array_diff_key(\$array1, \$array2) の結果 ---" . PHP_EOL; 47echo "配列1にのみ存在するキーの要素:" . PHP_EOL; 48print_r($result1); 49/* 50期待される出力: 51Array 52( 53 [product_id] => 101 54 [quantity] => 50 55 [status] => available 56) 57*/ 58 59echo PHP_EOL; // 結果を見やすくするための改行 60 61// 例2: 複数の配列と比較することも可能です。 62// $array1のキーと、$array2および$array3のいずれにも存在しないキーを持つ要素が返されます。 63$result2 = array_diff_key($array1, $array2, $array3); 64echo "--- array_diff_key(\$array1, \$array2, \$array3) の結果 ---" . PHP_EOL; 65echo "配列1にのみ存在するキーの要素 (配列2と配列3のキーと比較):" . PHP_EOL; 66print_r($result2); 67/* 68期待される出力: 69Array 70( 71 [status] => available 72) 73*/ 74 75echo PHP_EOL; // 結果を見やすくするための改行 76 77// array_diff_keyは値の比較を行わないことを示す例 78$arrayA = ['name' => 'Alice', 'id' => 1]; 79$arrayB = ['id' => 2, 'age' => 30]; // idの値は異なるがキーは共通 80 81$diffKeyResult = array_diff_key($arrayA, $arrayB); 82 83echo "--- 値の比較に関係なくキーのみを比較する例 ---" . PHP_EOL; 84echo "配列A: " . PHP_EOL; 85print_r($arrayA); 86echo "配列B: " . PHP_EOL; 87print_r($arrayB); 88echo "array_diff_key(\$arrayA, \$arrayB) の結果:" . PHP_EOL; 89print_r($diffKeyResult); 90/* 91期待される出力: 92Array 93( 94 [name] => Alice 95) 96*/ 97 98?>
array_diff_key関数は、複数の配列を比較し、最初の配列にのみ存在するキーを持つ要素を抽出するPHPの関数です。この関数は、配列のキーだけに着目し、キーが比較対象の他のどの配列にも含まれていない場合に、そのキーとその値を最初の配列から取得して新しい配列として返します。
引数としては、最初に比較の基準となる配列$arrayを指定し、その後ろに比較対象となる一つ以上の配列...$arraysを任意で追加します。戻り値は、抽出された要素を含む新しい配列です。重要な点として、この関数はキーのみを比較し、キーに対応する値は一切考慮されません。たとえ値が異なっていたとしても、キーが共通であれば、最初の配列からその要素は除外されます。
サンプルコードでは、$array1を基準として、$array2や$array3と比較しています。例えば、array_diff_key($array1, $array2)では、$array1に存在し$array2には存在しないキー(product_id, quantity, status)を持つ要素が結果として返されます。また、array_diff_key($array1, $array2, $array3)のように複数の配列を比較対象とすると、$array1のキーが$array2または$array3のいずれかにでも存在すれば除外され、最終的にstatusキーを持つ要素のみが残ります。値が異なっていてもキーが共通であれば除外される動作も示されており、array_diff_keyがキーのみを基に差分を抽出する機能であることが理解できます。
array_diff_key関数は、最初の配列に存在するキーのうち、比較対象の配列には存在しないキーを持つ要素のみを返します。この関数は値の比較を一切行わず、キーが一致するかどうかだけを判断する点に注意してください。キーが同じであれば、値の内容が異なっていてもそのキーを持つ要素は結果から除外されます。複数の配列を引数に渡した場合、最初の配列のキーが、後続のすべての配列のキーと比較されます。キーの存在チェックや、特定のキーを持つ要素を最初の配列から取り除きたい場合に活用すると良いでしょう。値の比較をしたい場合はarray_diffなどの別の関数を使用してください。