定義と使い方
- PHPバージョン
- 4.0.1+
array_diff() 関数は、2つ以上の 配列の値の差異(difference)を比較し、他の配列には存在せず、最初の配列にのみ存在する値で構成された配列を返します。
この関数は、他の配列に存在しない値を返すことで配列間の差異を見つけるために使用され、この特性を活かして、特定の値を配列から除去するためにも活用されます。
主に以下のような用途で使用されます。
- 配列の重複した値を削除する
- 配列間の差異を確認する
- 特定の値を配列から除去する
基本例
/* 配列の重複した値を削除する */
$array1 = ['apple', 'banana', 'orange']; // 比較の基準となる配列
$array2 = ['banana', 'apple', 'grape'];
$result = array_diff($array1, $array2);
print_r($result);
// Array ( [2] => orange ) => 返される配列のキーは、比較基準となる配列のキーがそのまま保持される
/* 配列間の差異を確認 */
$currentUser_info = ['id' => 1, 'name' => 'John', 'age' => 30];
$updatedUser_info = ['id' => 1, 'name' => 'John', 'age' => 31];
$differences = array_diff($updatedUser_info, $currentUser_info);
if (!empty($differences)) {
echo '変更されたデータがあります。変更内容: ';
foreach ($differences as $key => $value) {
echo "$key: $value ";
}
} else {
echo '変更されたデータはありません。';
}
// 出力: '変更されたデータがあります。変更内容: age: 31'
/* 特定の値を削除する */
$original_array = ['apple', 'banana', 'orange'];
$result = array_diff($original_array, ['banana']);
print_r($result); // Array ( [0] => apple [2] => orange )
ご確認ください!array_diff() 関数によって返される配列のキーは、比較の基準となる元の配列のキーがそのまま保持されます。
構文
array_diff(array $array_1, $array_2, $array_3, ...): array
引数
$array_1 |
必須。比較の基準となる配列です。 |
|---|---|
$array_2 |
必須(PHP 8.0.0 以降は任意)。最初の配列との比較対象となる配列です。 PHP 8.0.0 以降の変更点を参照してください。 |
$array_3, ... |
オプション。最初の配列との比較対象として、さらに追加する配列です。複数の配列を追加して比較することができます。 |
戻り値
比較する他の配列には存在せず、比較の基準となる最初の配列にのみ存在する値で構成された配列を返します。このとき、返される配列のキーは、比較の基準となる配列のキーがそのまま保持されます。
値を基準に比較した際に、最初の配列にのみ存在する要素がなければ、空の配列を返します。
$array1 = ['apple', 'banana', 'orange'];
$array2 = ['banana', 'apple', 'orange'];
$result = array_diff($array1, $array2);
print_r($result); // Array ( )
PHP 8.0.0 以降の変更点
PHP 8.0.0からは、array_diff() 関数をたった一つの引数だけで呼び出すことができるようになりました。
以前は少なくとも2つの引数が必要でした。
- PHP 8.0.0 より前のバージョンでは、常に少なくとも2つの配列を引数として渡す必要があります。
- PHP 8.0.0 バージョンからは、単一の配列のみを渡すことも可能であることを意味します。
$array1 = [1, 2, 3, 3, 4, 5, 5];
$unique = array_diff($array1);
print_r($unique);
/* 出力:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 3
[4] => 4
[5] => 5
[6] => 5
)
*/
上記のサンプルコードを見ると、array_diff() 関数は複数の配列間の差異を計算して返す関数ですが、一つの配列のみを渡した場合には比較対象となる配列が存在しないため、その配列全体が返されます。重複した値が存在する場合には、その重複した値も維持されます。
一つの配列内の重複した値を削除したり、ユニークな(一意の)値を抽出したりするには、array_unique() 関数を使用して次のように行うことができます。
$array = [1, 2, 3, 3, 4, 5, 5];
$unique = array_unique($array);
print_r($unique);
/* 出力:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
*/
注意点
array_diff() 関数を使用する際には、いくつかの注意点があります。
連想配列におけるキーと値の比較
array_diff() 関数は値のみを比較するため、連想配列でキーが異なっていても値さえ一致していれば、その値は維持されます。これにより、連想配列を扱う際には注意が必要な場合があります。
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['x' => 1, 'y' => 2, 'z' => 3];
$result = array_diff($array1, $array2);
print_r($result); // 出力: Array ( )
上記のコードにおいて、array_diff() 関数は値のみを比較するため、空の配列が返されます。
キーが互いに異なっていても、値がすべて一致しているため、空の配列が返されることになります。
したがって、連想配列では array_diff_assoc() 関数を使用して、キーと値の両方を比較する方がより明示的であり、期待通りに動作する可能性があります。
| 関数 | 相違点 |
|---|---|
array_diff() |
配列のキーを考慮せず、値のみを比較します。 |
array_diff_assoc() |
配列のキーと値の両方を比較します。 |
配列の値におけるデータ型を考慮しない
array_diff() 関数は値のみを比較し、データ型を考慮しません。例示コードを用いて説明します。
$array1 = [1, 2, '3']; // '3'は文字列として格納
$array2 = [1, 2, 3]; // 3は整数として格納
$differences = array_diff($array1, $array2);
print_r($differences); // 出力: Array ( )
上記のコードで $array1 と $array2 は、値 '3' と 3 を含んでいますが、データ型が互いに異なります。array_diff() 関数は値のみを比較し、その値は緩やかな比較(loose comparison)方式で比較されるため、データ型の違いを区別しません。したがって、データ型が異なっていても差異として検知されず、この場合には空の配列が返されます。
活用例
array_diff() 関数は、実戦においてさまざまな状況で活用できます。以下は、いくつか実用的な例です。
権限チェック
$user_permissions = ['read', 'write', 'delete'];
$required_permissions = ['read', 'execute'];
$missing_permissions = array_diff($required_permissions, $user_permissions);
if (empty($missing_permissions)) {
echo "ユーザーは必要なすべての権限を持っています。";
} else {
echo "ユーザーは次の権限が不足しています: " . implode(', ', $missing_permissions);
}
// 出力: 'ユーザーは次の権限が不足しています: execute'
補足説明implode() 関数は、配列の要素を一つの文字列に結合(変換)する関数です。
上記の例では、必要な権限リストを基準にして、ユーザーが持っていない権限があるかどうかを確認します。
選択されたオプションを除外する
$all_options = ['apple', 'banana', 'cherry', 'date'];
$selected_options = ['banana', 'date'];
$remaining_options = array_diff($all_options, $selected_options);
echo '選択されていないオプション: ' . implode(', ', $remaining_options);
// 出力: '選択されていないオプション: apple, cherry'
ユーザーが選択したオプションを基準に、全オプションの中から選択されていない項目のみを抽出します。
配列値の整理
$raw_data = ['apple', 'banana', '', 'date', null, 'cherry'];
$cleaned_data = array_diff($raw_data, ['', null]);
print_r($cleaned_data);
// 出力: Array ( [0] => apple [1] => banana [3] => date [5] => cherry )
配列から空の値('')または null 値を除外して整理します。array_diff() 関数はデータ型を厳密に比較しないため、削除対象の値によって結果が異なる場合がある点に注意が必要です。
バージョン管理システムで変更されたファイルを見つける
$committed_files = ['file1.php', 'file2.php', 'file3.php'];
$modified_files = ['file2.php', 'file3.php', 'file4.php'];
$new_files = array_diff($modified_files, $committed_files);
echo '新しいファイル: ' . implode(', ', $new_files);
// 出力: '新しいファイル: file4.php'
バージョン管理システムにおいて変更されたファイルリストを基準に、まだコミットされていない新しいファイルを見つけ出します。
これらの例は、array_diff() 関数を活用して配列間の差異を確認し、目的の値だけを選択的に処理できることを示しています。状況に応じて基準となる配列を適切に選択することで、簡単に配列を操作することが可能です。