定義と使い方
- PHPバージョン
- 4.3+
array_diff_assoc() 関数は、キー(Key)と値(Value)のペアを基準に配列間の差異(difference)を比較し、他の配列には存在しない最初の配列の要素で構成された連想(associative)配列を返します。
この関数は、連想配列において キー(Key)と値(Value)のペアが同時に一致するかを基準に、 他の配列に存在しない要素を探すために使用されます。つまり、キーと値がすべて一致して初めて、一致する要素と見なされます。この特性を活用すれば、特定のキーと値の組み合わせを基準に 連想配列から除外すべき要素を特定する際にも利用できます。
主に次のような用途で使用されます。
- 他の配列とキー(Key)と値(Value)のペアが同一の要素を除外する
- 連想配列間の差異(difference)を確認する
- 特定のキーと値のペアを基準に連想配列から要素を削除する
基本例
/* 他の配列とキー(Key)と値(Value)のペアが同一の要素を除外する */
$array1 = ['a' => 1, 'b' => 2, 'c' => 3]; // 比較基準となる配列
$array2 = ['b' => 2, 'c' => 3, 'd' => 4];
$result = array_diff_assoc($array1, $array2);
print_r($result); // Array ( [a] => 1 )
<br>
/* 連想配列間の差異(difference)を確認する */
$current_user_info = ['id' => 1, 'name' => 'John', 'age' => 30];
$updated_user_info = ['id' => 1, 'name' => 'John', 'age' => 31];
$differences = array_diff_assoc($updated_user_info, $current_user_info);
if (!empty($differences)) {
echo '変更されたデータがあります。変更された情報: ';
foreach ($differences as $key => $value) {
echo "$key: $value ";
}
} else {
echo '変更されたデータがありません。';
}
// 出力: '変更されたデータがあります。変更された情報: age: 31'
<br>
/* 特定のキーと値のペアを基準に連想配列から要素を削除する */
$original_array = ['id' => 1, 'name' => 'John', 'age' => 30];
$value_to_remove = 'John';
$result = array_diff_assoc($original_array, ['name' => $value_to_remove]);
print_r($result); // Array ( [id] => 1 [age] => 30 )
array_diff_assoc() 関数は、キー(Key)と値(Value)のペアが同時に一致するかを基準に他の配列に存在しない要素を探すために使用されますが、array_diff() 関数はキーとは無関係に値のみを比較して、他の配列に存在しない値を探すために使用されます。
| 関数 | 違い |
|---|---|
array_diff_assoc() |
配列のキー(Key)と値を両方比較します。 |
array_diff() |
配列のキーを考慮せず、値のみを比較します。 |
構文
array_diff_assoc(array $array_1, $array_2, $array_3, ...): array
引数
$array_1 |
必須。比較基準となる配列です。 |
|---|---|
$array_2 |
必須(PHP 8.0.0 以降は任意)。最初の配列との比較対象となる配列です。 PHP 8.0.0 以降の変更点を参照してください。 |
$array_3, ... |
オプション。最初の配列との比較対象として、さらに対象を追加するための配列であり、複数の配列を追加することが可能です。 |
戻り値
2つ以上の配列でキーと値のペアが同時に一致するかを比較して差異をチェックし、他の配列には存在せず最初の配列にのみ存在するキーと値のペアで構成された、新しい連想配列を返します。
もしキー(Key)と値(Value)のペアを基準に比較した際、最初の配列にのみ存在する要素がなければ、空の配列を返します。
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_diff_assoc($array1, $array2);
print_r($result); // Array ( )
PHP 8.0.0 以降の変更点
PHP 8.0.0 以降、array_diff_assoc() 関数は引数一つのみで呼び出せるようになりました。
以前のバージョンでは、少なくとも二つの引数が必要でした。
- PHP 8.0.0 未満のバージョンでは、常に少なくとも2つの配列を引数として渡す必要があります。
- PHP 8.0.0 以降は、配列を一つだけ渡す形でも呼び出しが可能であることを意味します。
一つの配列のみを渡す場合、比較対象が存在しないため、渡された配列がそのまま返されます。
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_diff_assoc($array);
print_r($result);
/* 出力:
Array
(
[a] => 1
[b] => 2
[c] => 3
)
*/
注意点
array_diff_assoc() 関数は、キー(Key)と値(Value)のペアを基準に配列間の差異(difference)を比較します。
データ型が異なっても、文字列としての表現が同じである場合
キー(Key)はPHPの配列規則に従い厳密な一致のみが比較され、値(Value)は緩やかな比較(loose comparison)によって比較されるため、データ型の違いは区別されません。
$array1 = ['a' => 1, 'b' => 2, 'c' => '3']; // '3'は文字列として保存
$array2 = ['a' => 1, 'b' => 2, 'c' => 3]; // 3は整数として保存
$differences = array_diff_assoc($array1, $array2);
print_r($differences); // Array ( )
上記のコードで $array1 と $array2 は値 '3' と 3 を含んでいますが、緩やかな比較ではこれらは同一であると判断されます。したがって、array_diff_assoc() 関数はこの違いを差異として検出し、結果として空の配列を返します。
文字列表現は同一である必要があります。
データ型が異なっていても文字列表現が同じ場合には同一として処理されますが、array_diff_assoc() 関数は二つの値を比較する際、各要素をまず文字列(string)に変換した後、文字列基準の比較(string comparison)を行います。つまり、異なるデータ型であっても文字列に変換したときにその形式が同じであれば「一致」するものとみなされます。
$array1 = array(0, 1, 2); // 整数 0, 1, 2
$array2 = array('00', '01', '2'); // 文字列 '00', '01', '2'
$result = array_diff_assoc($array1, $array2);
print_r($result);
/* 出力:
Array
(
[0] => 0
[1] => 1
)
*/
整数 2 は文字列 '2' と一致するため除外されますが、0 と 1 は文字列に変換してもそれぞれ '0'、'1' となり、'00'、'01' とは異なるため、差異として識別されます。
活用例
array_diff_assoc() 関数は、実務においてさまざまな状況で活用できます。以下にいくつかの実践的な例を挙げます。
権限チェック
$current_permissions = ['read' => true, 'write' => true, 'execute' => false];
$required_permissions = ['read' => true, 'write' => true, 'execute' => true];
$missing_permissions = array_diff_assoc($required_permissions, $current_permissions);
if (!empty($missing_permissions)) {
echo 'ユーザーは以下の権限が不足しています: ' . implode(', ', array_keys($missing_permissions));
} else {
echo '権限は十分です。';
}
// 出力: 'ユーザーは以下の権限が不足しています: execute'
補足説明implode() 関数は、配列の要素を一つの文字列に結合(変換)する関数です。
補足説明array_keys() 関数は、指定された配列からキー(keys)のみを抽出して、新しい配列として返します。
上の例では、必要な権限を基準としてユーザーの権限と比較し、値が一致しないキー(Key)を不足している権限として判断します。
選択されたオプションの除外
$all_options = ['apple' => 1, 'banana' => 2, 'cherry' => 3, 'date' => 4];
$selected_options = ['banana' => 2, 'date' => 4];
$remaining_options = array_diff_assoc($all_options, $selected_options);
echo '選択されていないオプション: ' . implode(', ', array_keys($remaining_options));
// 出力: '選択されていないオプション: apple, cherry'
ユーザーが選択したオプションを基準に、すべてのオプションの中から選択されていないオプションを特定します。
バージョン管理システムで変更されたファイルの特定
$committed_files = [
'file1.txt' => 'hash1',
'file2.txt' => 'hash2',
'file3.txt' => 'hash3'
];
$modified_files = [
'file1.txt' => 'hash1',
'file3.txt' => 'hash3',
'file4.txt' => 'hash4'
];
$new_files = array_diff_assoc($modified_files, $committed_files);
if (!empty($new_files)) {
echo '変更されたファイルの一覧: ' . implode(', ', array_keys($new_files));
} else {
echo '変更されたファイルはありません。';
}
// 出力: '変更されたファイルの一覧: file4.txt'
バージョン管理システムで変更されたファイルの一覧とコミットされたファイルの一覧を比較し、新しく追加されたファイルや内容が変更されたファイルを特定します。
これらの例は、array_diff_assoc() 関数を通じて、さまざまな状況で連想配列間の差異を特定し、望む操作を行えることを示しています。この関数を適切に活用することで、連想配列を簡便に処理することができます。