定義と使い方
- PHPバージョン
- 4.3+
array_intersect_assoc() 関数は、キー(Key)と値(Value)のペアを基準に配列間の共通部分(intersection)を比較して、他の配列と共通して存在する最初の配列の要素で構成された連想(associative)配列を返します。
この関数は、連想配列においてキー(Key)と値(Value)のペアが同時に一致するかを基準に、他の配列と共通して存在する要素を見つけるために使用されます。つまり、キーと値がすべて一致して初めて共通要素とみなされます。この特性を活用すれば、特定のキーと値の組み合わせを基準として、複数の連想配列で共通して維持すべき要素を識別するのに使用できます。
主に次のような用途で使用されます。
- 他の配列とキー(Key)と値(Value)のペアがすべて同一の共通要素を見つける
- 連想配列間の共通要素(intersection)を確認する
- 特定のキーと値のペアを基準に、連想配列から共通要素のみを抽出する
基本例
/* 他の配列とキー(Key)と値(Value)のペアがすべて同一の共通要素を見つける */
$array1 = ['a' => 1, 'b' => 2, 'c' => 3]; // 比較基準となる配列
$array2 = ['b' => 2, 'c' => 3, 'd' => 4];
$result = array_intersect_assoc($array1, $array2);
print_r($result); // Array ( [b] => 2 [c] => 3 )
/* 連想配列間の共通要素(intersection)の確認 */
$current_user_info = ['id' => 1, 'name' => 'John', 'age' => 30];
$updated_user_info = ['id' => 1, 'name' => 'John', 'age' => 31];
$common = array_intersect_assoc($updated_user_info, $current_user_info);
if (!empty($common)) {
echo '共通して維持されているデータがあります:';
foreach ($common as $key => $value) {
echo "$key: $value ";
}
} else {
echo '共通データがありません。';
}
// 出力:'共通して維持されているデータがあります:id: 1 name: John'
/* 特定のキーと値のペアを基準に、連想配列から共通要素のみを抽出する */
$original_array = ['id' => 1, 'name' => 'John', 'age' => 30];
$criteria = ['name' => 'John'];
$result = array_intersect_assoc($original_array, $criteria);
print_r($result); // Array ( [name] => John )
array_intersect_assoc() 関数は、キー(Key)と値(Value)のペアが同時に一致するかを基準に、他の配列と共通して存在する要素を見つけるために使用します。
一方、array_intersect() 関数は、キー(Key)は考慮せず、値(Value)のみを比較して、他の配列と共通して存在する値を見つけるために使用します。
| 関数 | 違い |
|---|---|
array_intersect_assoc() |
配列のキーと値をすべて比較します。 |
array_intersect() |
配列のキーは考慮せず、値のみを比較します。 |
構文
array_intersect_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)のペアが同時に一致するかを基準に共通部分を比較し、他の配列と共通して存在する最初の配列のキーと値のペアで構成された新しい連想配列を返します。
もしキー(Key)と値(Value)のペアを基準に比較したとき、最初の配列と共通して存在する要素がなければ、空の配列を返します。
$array1 = ["a" => 1, "b" => 2, "c" => 3];
$array2 = ["b" => 3, "c" => 4, "d" => 5];
$common_elements = array_intersect_assoc($array1, $array2);
print_r($common_elements); // Array ( )
PHP 8.0.0 バージョンからの変更事項
PHP 8.0.0からは、array_intersect_assoc() 関数をたった一つのパラメーターのみで使用して呼び出せるようになりました。
以前は、最低二つのパラメーターが必要でした。
- PHP 8.0.0 バージョン以前は、常に少なくとも二つの配列をパラメーターとして渡す必要があります。
- PHP 8.0.0 バージョンからは、単一の配列のみを渡すこともできるようになったことを意味します。
$array = ["a" => 1, "b" => 2, "c" => 3];
$result = array_intersect_assoc($array);
print_r($result);
/* Output:
Array
(
[a] => 1
[b] => 2
[c] => 3
)
*/
注意点
array_intersect_assoc() 関数は、キー(Key)と値(Value)のペアを基準に、他の配列と共通(intersection)して存在する要素を見つけるために使用されます。
データ形式が異なっていても、文字列としての表現が同じ場合
キー(Key)はPHPの配列規則に従って同一性のみが比較され、値(Value)は緩やかな比較(loose comparison)方式で比較されるため、データ型の違いは区別されません。
$array1 = ['a' => 1, 'b' => 2, 'c' => '3']; // '3'は文字列として保存
$array2 = ['a' => 1, 'b' => 2, 'c' => 3]; // 3は整数として保存
$intersect = array_intersect_assoc($array1, $array2);
print_r($intersect);
/* 出力:
Array
(
[a] => 1
[b] => 2
[c] => 3
)
*/
上記のコードで $array1 と $array2 は、値 '3' と 3 を含んでいますが、緩やかな比較(loose comparison)ではこれら二つの値は同一であると判断されます。したがって、array_intersect_assoc() 関数はこのデータ型の違いを区別せず、該当する要素を共通要素とみなして結果の配列に含めます。
文字列としての表現は同一である必要があります。
データ型が異なっていても文字列としての表現が同じ場合には同一として処理されますが、array_intersect_assoc() 関数は二つの値を比較する際、各要素をまず文字列(string)に変換した後、文字列基準の比較(string comparison)を実行します。つまり、異なるデータ型であっても文字列に変換したときにその形が同じであれば「一致」するものと見なされます。
$array1 = array(0, 1, 2); // 整数 0, 1, 2
$array2 = array('00', '01', '2'); // 文字列 '00', '01', '2'
$result = array_intersect_assoc($array1, $array2);
print_r($result);
/* 出力:
Array
(
[2] => 2
)
*/
0 と 1 は文字列に変換してもそれぞれ '0'、'1' となり、'00'、'01' とは異なるため差異として識別されますが、整数 2 と文字列 '2' は共通点として識別されます。
活用例
主に次のような用途で活用されます。
- データの検索およびフィルタリング
- データの一致確認
- 関連データの処理
データの検索およびフィルタリング
複数のデータ配列があるとき、特定のキーと値が共通して存在する要素を見つけ出し、データを検索したりフィルタリングしたりすることができます。
以下は、商品の情報を持つ配列があり、ユーザーが選択したフィルター条件が与えられていると仮定した例です。ユーザーが選択したフィルターに該当する商品を見つけ出す例題です。
$products = [
['id' => 1, 'name' => 'Laptop', 'brand' => 'Dell', 'price' => 1200],
['id' => 2, 'name' => 'Smartphone', 'brand' => 'SONY', 'price' => 800],
['id' => 3, 'name' => 'Tablet', 'brand' => 'Apple', 'price' => 600],
['id' => 4, 'name' => 'Smartwatch', 'brand' => 'Fitbit', 'price' => 150],
];
// ユーザーが選択したフィルター条件
$filter_criteria = ['brand' => 'SONY', 'price' => 800];
// ユーザーが選択した条件と一致する商品を探す
$filtered_products = [];
foreach ($products as $product) {
if (count(array_intersect_assoc($product, $filter_criteria)) === count($filter_criteria)) {
$filtered_products[] = $product;
}
}
// 結果出力
print_r($filtered_products);
/*
Array
(
[0] => Array
(
[id] => 2
[name] => Smartphone
[brand] => SONY
[price] => 800
)
)
*/
コードの補足説明count() 関数は、指定された配列のすべての要素の数を数えて(count)整数として返します。
この結果からわかるように、ユーザーが選択したフィルター条件に該当する商品が配列として出力されました。選択したブランドが 'SONY' で価格が 800 である商品が存在するため、この商品が結果の配列に含まれました。
データの一致確認
2つ以上の配列で、特定のキーと値が同時に一致するかどうかを確認する際に使用できます。
以下は、2つの配列で同一のキーと値があるかを確認する例です。
// 2人のユーザーの情報
$user_1 = [
'id' => 1,
'username' => 'john_doe',
'email' => 'john@example.com',
'age' => 30,
];
$user_2 = [
'id' => 2,
'username' => 'jane_smith',
'email' => 'jane@example.com',
'age' => 28,
];
// 2人のユーザーの情報で同一のキーと値があるかを確認する関数
function has_matching_info($user_1, $user_2) {
$matching_info = array_intersect_assoc($user_1, $user_2);
// 同一のキーと値がある場合に返す
return !empty($matching_info);
}
// 結果出力
if (has_matching_info($user_1, $user_2)) {
echo '2人のユーザーの情報で一致する内容があります。';
} else {
echo '2人のユーザーの情報で一致する内容がありません。';
}
// 出力: '2人のユーザーの情報で一致する内容がありません。'
このコードでは、2人のユーザーの情報を配列で表現し、has_matching_info 関数を使用して2つの配列間に同一のキーと値があるかを確認しています。そして、その結果に応じてメッセージを出力します。
関連データの処理
複数のデータ配列において、特定の関連するキーと値が同時に存在する場合、それに基づいてデータを処理したり操作したりすることができます。
次は、ユーザーたちの注文データがある状況で、2人のユーザーの注文の中で同一の製品を注文したケースを確認するコードの例です。
// ユーザー1のプログラミング言語の好み
$user1_languages = [
'Python' => 4,
'JavaScript' => 5,
'Java' => 3,
];
// ユーザー2のプログラミング言語の好み
$user2_languages = [
'JavaScript' => 5,
'Java' => 4,
'PHP' => 2,
];
// 2人のユーザーのプログラミング言語の好みの中で、同一の言語を探す関数
function find_matching_languages($languages1, $languages2) {
$matching_languages = array_intersect_assoc($languages1, $languages2);
return $matching_languages;
}
// 結果出力
$matching_languages = find_matching_languages($user1_languages, $user2_languages);
if (!empty($matching_languages)) {
echo '2人のユーザーが同一のプログラミング言語を好んでいます。('
. implode(', ', array_keys($matching_languages)) . ')';
} else {
echo '2人のユーザーが同一のプログラミング言語を好んでいません。';
}
// 出力: 2人のユーザーが同一のプログラミング言語を好んでいます。(JavaScript)
コードの補足説明implode() 関数は、配列の要素を順番に区切り文字で結合して生成した文字列を返します。
コードの補足説明array_keys() 関数は、指定された配列からキー(keys)だけを抽出して、新しい配列として返します。
このコードでは、find_matching_products 関数を使用して、2人のユーザーの注文の中から同一の製品を探します。結果に応じて、ユーザーが同一の製品を注文したかどうかの結果を出力します。このコードは、簡単な注文データを活用して、2人のユーザー間でどの製品を共通して注文したかを確認する例です。
関連項目
- PHP array_intersect()関数:他の配列との共通値の抽出する
- PHP array_diff()関数:他の配列に含まれていない値を探す
- PHP array_diff_assoc()関数:キーと値のペアを基準に配列の差異を比較
- PHP in_array()関数:配列に特定の値が含まれているかを確認する
- PHP foreach文:配列やオブジェクトを簡単に反復処理するための構文
- PHP array_map()関数:概念の整理と使用例
- PHP array_filter()関数:配列から必要な値だけを抽出する
- PHP array_search()関数:配列から値を検索する
- PHP array_values()関数:配列の値一覧を取得