定義と使い方
- PHPバージョン
- 4.0.1+
array_intersect() 関数は、基準となる配列の中から、1つ以上の他の配列にも同様に存在する共通(intersect、積集合)の値を抽出し、配列として返します。
この関数は配列間の共通の値を比較する際に活用され、主に以下のような状況で使用されます。
- 二つの配列に共通して存在する値の抽出
- ユーザーが入力した値が既に存在するかどうかの確認
- 複数のデータソースに同時に存在するデータのみを選別
特徴
- この関数は、キー(Key)ではなく値(Value)を基準に配列の共通要素を抽出します。その際、緩やかな比較(
==)を使用するため、データの型が異なっていても内容が同じであれば一致するものと見なされます。 - 返された配列のキーは、基準となる配列のキーがそのまま保持されます。
基本例
array_intersect() 関数の仕組みを正確に理解するには、
インデックス配列同士の比較、
連想配列同士の比較、
インデックス配列と連想配列の比較
これら3つの動作原理をそれぞれ確認することです。
インデックス配列同士の比較
/* インデックス配列同士の比較 */
$index_array1 = [1, 2, 3, 4, 5]; // 比較基準となる配列
$index_array2 = [2, 3, 4, 6, 7];
$index_unique_value = array_intersect($index_array1, $index_array2);
print_r($index_unique_value);
Array
(
[1] => 2
[2] => 3
[3] => 4
)
連想配列同士の比較
/* 連想配列同士の比較 */
$assoc_array1 = [ // 比較基準となる配列
'a' => 'apple',
'b' => 'banana',
'c' => 'carrot',
'd' => 'date'
];
$assoc_array2 = [
'x' => 'carrot',
'b' => 'grape',
'y' => 'apple'
];
$assoc_unique_value = array_intersect($assoc_array1, $assoc_array2);
print_r($assoc_unique_value);
Array
(
[a] => apple
[c] => carrot
)
インデックス配列と連想配列の比較
/* インデックス配列と連想配列の比較 */
$arr_idx = ['a', 'b', 'c']; // 比較基準となる配列
$arr_assoc = [
'x' => 'b',
'y' => 'c',
'z' => 'd'
];
$assoc_unique_value = array_intersect($arr_idx, $arr_assoc);
print_r($assoc_unique_value);
Array
(
[1] => b
[2] => c
)
構文
array_intersect(array $array_1, $array_2, $array_3, ...): array
引数
$array_1 |
必須。比較基準となる配列です。 |
|---|---|
$array_2 |
必須(PHP 8.0.0 バージョンからはオプション)。最初の配列と比較対象にする配列です。 PHP 8.0.0 バージョンからの変更事項を参照してください。 |
$array_3, ... |
オプション。最初の配列と比較対象にする配列をさらに追加した配列で、複数の配列を追加できます。 |
戻り値
比較基準となる配列と、1つ以上の他の配列との共通値を探し、配列として返します。
この際、返される配列のキーは、比較基準となる配列のキーがそのまま保持されます。ただし、インデックス配列(数値キーのみの配列)の場合、キーは 0 から振り直されます。
もし、比較する他の配列と、比較基準となる最初の配列の両方に共通して存在する値がない場合には、空の配列を返します。
$array1 = [1, 2, 3, 4, 5];
$array2 = [6, 7];
$result = array_intersect($array1, $array2);
print_r($result); // Array ( )
PHP 8.0.0 バージョンからの変更事項
PHP 8.0.0からは、array_intersect() 関数をたった一つの引数のみで呼び出すことが可能になりました。以前は、最低二つの引数が必要でした。
- PHP 8.0.0 より前のバージョンでは、常に少なくとも2つの配列を引数として渡す必要があります。
- PHP 8.0.0 バージョンからは、たった一つの配列だけを渡すことも可能であることを意味します。
$array = [1, 2, 2, 3, 4, 4, 5];
$uniqueValues = array_intersect($array);
print_r($uniqueValues);
// PHP 8.0.0 以降のバージョンでは、一つの配列のみ渡すことが可能
/* 出力:
Array
(
[0] => 1
[1] => 2
[2] => 2
[3] => 3
[4] => 4
[5] => 4
[6] => 5
)
*/
上の例のコードを見ると、$uniqueValues は $array 配列全体をそのまま返します。
array_intersect() 関数は、最低二つの配列を比較して共通部分(積集合)を探しますが、一つの配列のみが渡された場合はその配列自体を返すためです。正確な共通部分を探すためには、最低限二つの配列が必要です。
一つの配列の中で重複する値を返すには、次のように行うことができます。
$array = [1, 2, 2, 3, 4, 4, 5];
$counts = array_count_values($array);
$duplicates = array_filter($counts, function($count) {
return $count > 1;
});
print_r(array_keys($duplicates)); // Array ( [0] => 2 [1] => 4 )
上のコードで array_count_values() 関数を使用して値の回数を計算し、array_filter() 関数を使用して回数が1より大きい値を見つけ出します。最後に array_keys() 関数を使用して重複した値の配列を返します。このような方式で重複した値を返すことができます。
注意点
array_intersect() 関数を使用する際の注意点を見ていきましょう。
連想配列におけるキーと値の比較
array_intersect() 関数は値のみを比較するため、連想配列においてキーが異なり値だけが一致する場合でも、その値を共通値として扱います。これにより、連想配列では注意すべき点が発生することがあります。
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['x' => 1, 'y' => 2, 'z' => 3];
$result = array_intersect($array1, $array2);
print_r($result); // 出力: Array ( [a] => 1 [b] => 2 [c] => 3 )
上記のコードにおいて array_intersect( )関数は、値のみを比較して $array1 と同一のキーと値を返します。
これは、キーが異なっていても値が一致する場合には、該当する値を結果の配列に含めます。
キーと値がすべて一致する場合を探すには、array_intersect_assoc() 関数を使用してください。
配列の値においてデータ形式を考慮しない
array_intersect() 関数は値のみを比較し、データ形式を考慮しません。つまり、値のデータ形式が異なっていても同一の値として扱われます。例示コードを通して説明します。
$array1 = [1, 2, '3']; // '3'は文字列
$array2 = [1, 2, 3]; // 3は整数
$result = array_intersect($array1, $array2);
print_r($result); // 出力: Array ( [0] => 1 [1] => 2 [2] => 3 )
上記のコードにおいて $array1 と $array2 は、値 '3' と 3 を含んでいますが、データ型がそれぞれ異なります。array_intersect( )関数は値のみを比較し、その比較には緩やかな比較(loose comparison)方式が用いられるため、データ型の違いは区別されません。したがって、データ型が異なっていても一致するものとみなされ、結果の配列に含まれることになります。
活用例
array_intersect( )関数は、実務におけるさまざまな場面で活用できます。以下に、実践的な例をいくつか挙げます。
データベースの重複データの抽出
array_intersect( )関数を使用すると、データベースから取得した配列と選択された配列の間で、共通する値を簡単に抽出することができます。
$userIdsFromDatabase = [1, 2, 3, 4, 5];
$selectedUserIds = [2, 4, 6, 8, 10];
$commonUserIds = array_intersect($userIdsFromDatabase, $selectedUserIds);
print_r($commonUserIds); // Array ( [1] => 2 [3] => 4 )
上記の例では、データベースから取得したユーザーIDの配列と、選択されたユーザーIDの配列の間で、共通するユーザーIDを抽出しています。この手法は、重複したIDを処理する際に非常に有効です。
フォーム入力値のバリデーション
フォームにおいて、ユーザーが送信した値が「許可された値」のいずれかに該当するかどうかを確認する際にも非常に便利です。
$submittedTags = ['php', 'javascript', 'html'];
$allowedTags = ['html', 'css', 'javascript', 'python'];
$validTags = array_intersect($submittedTags, $allowedTags);
print_r($validTags); // Array ( [2] => javascript [1] => html )
上記の例では、ユーザーが提出したタグ配列と許可されたタグ配列の間の共通の値を見つけ、フォーム入力の有効性検査を遂行します。
ユーザー権限の管理
array_intersect( )を活用して、管理者が持つ権限とユーザーが実際に持つ権限の間の共通部分を見つけ出すことができます。
$adminPermissions = ['read', 'write', 'delete', 'update'];
$userPermissions = ['read', 'write'];
$allowedPermissions = array_intersect($adminPermissions, $userPermissions);
print_r($allowedPermissions); // Array ( [0] => read [1] => write )
上記の例では、管理者権限とユーザー権限の配列の間で共通の権限を見つけ出し、ユーザーが持つことのできる最大の権限を識別します。
商品在庫の管理
在庫管理において、ユーザーが選択した商品と実際に在庫がある商品の間の共通の商品を見つける際に有用です。
$availableProducts = ['product1', 'product2', 'product3', 'product4'];
$selectedProducts = ['product2', 'product4', 'product5'];
$inStockProducts = array_intersect($availableProducts, $selectedProducts);
print_r($inStockProducts); // Array ( [1] => product2 [3] => product4 )
上記の例では、在庫にある商品と選択された商品の間の共通の値を見つけ、実際に購入可能な商品を抽出します。
array_intersect( )関数を活用すれば、さまざまな状況において配列間の共通する値を効果的に管理し、活用することができます。