Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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 */
9
10// 例1: 2つの配列を比較する基本的な使い方
11// 最初の配列 $userPermissions は、あるユーザーに許可された機能を示します。
12$userPermissions = [
13    'read'   => true,
14    'write'  => true,
15    'delete' => false,
16    'admin'  => false,
17];
18
19// 2番目の配列 $guestPermissions は、ゲストユーザーに許可された機能を示します。
20$guestPermissions = [
21    'read'   => true,
22    'search' => true, // 'search' キーは $userPermissions には存在しません
23];
24
25echo "--- 2つの配列での比較例 ---\n";
26
27// array_diff_key を使用して、$userPermissions にのみ存在するキーを探します。
28// 'read' は両方に存在するため除外されます。
29// 'write', 'delete', 'admin' は $userPermissions にのみ存在するため結果に含まれます。
30// 'search' は $userPermissions に存在しないため、結果には含まれません (最初の配列が基準となるため)。
31$exclusiveToUser = array_diff_key($userPermissions, $guestPermissions);
32
33echo "ユーザーにのみ存在する権限:\n";
34print_r($exclusiveToUser);
35// 想定される出力:
36// Array
37// (
38//     [write] => 1
39//     [delete] => 
40//     [admin] => 
41// )
42
43echo "\n--- 複数の配列での比較例 ---\n";
44
45// 例2: 3つ以上の配列を比較する使い方
46// 追加の配列 $moderatorPermissions を定義します。
47$moderatorPermissions = [
48    'read'    => true,
49    'write'   => true,
50    'monitor' => true, // 'monitor' キーは $userPermissions には存在しません
51];
52
53// array_diff_key を使用して、$userPermissions にのみ存在し、$guestPermissions と $moderatorPermissions の
54// どちらにも存在しないキーを探します。
55//
56// $userPermissions: read, write, delete, admin
57// $guestPermissions: read, search
58// $moderatorPermissions: read, write, monitor
59//
60// - 'read': $userPermissions, $guestPermissions, $moderatorPermissions の全てに存在 -> 除外
61// - 'write': $userPermissions, $moderatorPermissions に存在 -> 除外 (比較対象のいずれかにあれば除外)
62// - 'delete': $userPermissions にのみ存在 -> 結果に含まれる
63// - 'admin': $userPermissions にのみ存在 -> 結果に含まれる
64$exclusiveToUserAcrossMultiple = array_diff_key($userPermissions, $guestPermissions, $moderatorPermissions);
65
66echo "ユーザーにのみ存在し、ゲストやモデレーターには存在しない権限:\n";
67print_r($exclusiveToUserAcrossMultiple);
68// 想定される出力:
69// Array
70// (
71//     [delete] => 
72//     [admin] => 
73// )
74
75?>

PHPのarray_diff_key関数は、複数の配列を比較し、最初の配列にのみ存在するキーを持つ要素を抽出するために使用されます。システムエンジニアを目指す方にとって、設定管理や権限チェックなど、複数のデータセット間で特定の差分を見つけたい場合に非常に役立つ機能です。

この関数は、最初の引数として基準となる配列を受け取り、その後に比較対象となる1つまたは複数の配列を引数として指定できます。戻り値は配列となり、最初の配列に存在し、かつ他のすべての比較対象配列には存在しないキーと、それに対応する値を持つ新しい配列が返されます。

サンプルコードでは、$userPermissionsというユーザーの権限リストを基準に、$guestPermissions$moderatorPermissionsといった他の権限リストと比較しています。例えば、$userPermissions$guestPermissionsを比較した場合、readキーは両方に存在するため結果から除外されますが、writedeleteadmin$userPermissionsにのみ存在するため、結果の配列に含まれます。

さらに、複数の比較対象配列を指定することで、より複雑な条件でのキーの差分抽出も可能です。これにより、$userPermissionsにのみ存在し、$guestPermissions$moderatorPermissionsのどちらにも存在しないキーを正確に特定することができます。この関数は、配列のキーに基づいたデータのフィルタリングや整合性チェックにおいて、コードを簡潔に保つ上で非常に強力なツールとなります。

array_diff_key関数は、配列の「キー」のみを比較し、値は無視される点にご注意ください。戻り値の配列は、常に最初の引数で指定した配列から、他の比較対象配列のいずれにも存在しないキーを持つ要素だけが抽出されます。そのため、2つ目以降の比較対象配列にのみ存在するキーは、結果には決して含まれません。複数の配列を比較対象として指定した場合、いずれかの比較対象配列に同じキーが存在するだけで、最初の配列からはそのキーを持つ要素が除外されます。この関数は、特定の配列にのみ存在する要素を効率的に特定したい場合に特に役立ちます。

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などの別の関数を使用してください。

PHP array_diff_keyでキーが異なる要素を抽出する

1<?php
2
3/**
4 * array_diff_key関数の使用例
5 *
6 * 最初の配列にのみ存在するキーを持つ要素を抽出します。
7 * 比較対象となる配列が複数ある場合は、それらのいずれにも存在しないキーが抽出されます。
8 */
9
10// 基準となる配列を定義します。
11$baseArray = [
12    'id' => 101,
13    'name' => 'Alice',
14    'email' => 'alice@example.com',
15    'status' => 'active',
16];
17
18// 比較対象となる配列を定義します。
19// この配列には 'id' と 'name' のキーが含まれます。
20$compareArray1 = [
21    'id' => 200,
22    'name' => 'Bob',
23    'role' => 'admin',
24];
25
26// 別の比較対象となる配列を定義します。
27// この配列には 'email' のキーが含まれます。
28$compareArray2 = [
29    'email' => 'charlie@example.com',
30    'phone' => '123-456-7890',
31];
32
33// array_diff_key() 関数を使用して、$baseArray にのみ存在するキーを持つ要素を抽出します。
34// $baseArray から $compareArray1 に存在するキー('id', 'name')を除外した結果が得られます。
35$result1 = array_diff_key($baseArray, $compareArray1);
36
37echo "--- array_diff_key(\$baseArray, \$compareArray1) の結果 ---\n";
38print_r($result1);
39/*
40期待される出力例:
41Array
42(
43    [email] => alice@example.com
44    [status] => active
45)
46*/
47
48echo "\n";
49
50// 複数の比較配列を指定することも可能です。
51// $baseArray から、$compareArray1 または $compareArray2 のいずれかに存在するキーを除外した結果が得られます。
52// ($compareArray1 に 'id', 'name' があり、$compareArray2 に 'email' があるため、それらが除外されます)
53$result2 = array_diff_key($baseArray, $compareArray1, $compareArray2);
54
55echo "--- array_diff_key(\$baseArray, \$compareArray1, \$compareArray2) の結果 ---\n";
56print_r($result2);
57/*
58期待される出力例:
59Array
60(
61    [status] => active
62)
63*/
64
65?>

PHPのarray_diff_key関数は、複数の配列間でキーを比較し、最初の配列にのみ存在するキーを持つ要素を抽出するために使用されます。この関数は、最初の引数に比較の基準となる配列を受け取り、その後に比較対象となる一つ以上の配列を可変長引数として受け取ります。そして、最初の配列から、比較対象のいずれかの配列と共通するキーを持つ要素を取り除いた新しい配列を返します。ここで重要なのは、要素の「値」ではなく「キー」のみを比較する点です。

例えば、$baseArray$compareArray1を比較する最初の例では、$compareArray1に存在する'id''name'のキーが$baseArrayから除外され、結果として'email''status'のキーを持つ要素が残ります。このようにして、基準配列にのみ存在するキーを持つ情報だけを抽出できます。

さらに、複数の配列を比較対象として指定することも可能です。$baseArrayに対して$compareArray1$compareArray2を比較する二つ目の例では、$compareArray1に含まれる'id''name'のキー、そして$compareArray2に含まれる'email'のキーがすべて$baseArrayから除外されます。その結果、どの比較配列にも存在しない'status'のキーを持つ要素だけが抽出されます。array_diff_key関数は、配列のキーを基準にして、特定のキーを持たない要素を効率的に見つけ出す際に非常に役立ちます。

array_diff_key関数は、最初の配列のキーを基準とし、それ以降に渡された比較配列に存在するキーを取り除いた結果を返します。この関数は配列の「値」ではなく「キー」のみを比較するため、値が異なっていてもキーが一致すれば、その要素は結果から除外されます。複数の比較配列を指定した場合、最初の配列から、それらすべての比較配列のいずれかに存在するキーが除外される動作となります。特に、キーの比較は厳密に行われますので、数値型のキーと文字列型のキーなど、型が異なる場合は別のキーとして扱われる点にご注意ください。

関連コンテンツ

関連プログラミング言語