【PHP8.x】array_intersect_key関数の使い方

作成日: 更新日:

array_intersect_key関数は、複数の配列の中から共通のキーを持つ要素だけを抽出し、新しい配列として返す関数です。この関数は、主に複数のデータセットにわたって共通の識別子(キー)を持つ項目を効率的に見つけ出す目的で使用されます。

使用方法としては、まず最初の引数に基準となる配列を指定します。その後の引数には、比較の対象となる一つ以上の配列を指定することができます。array_intersect_key関数は、指定されたすべての配列に共通して存在するキーを見つけ出し、その共通のキーを持つ要素を、最初の基準配列から選択して結果の配列を生成します。このとき、抽出される要素の値は基準となる最初の配列のものがそのまま使用され、キーの比較は厳密に行われます。

例えば、ユーザーのIDをキーとする複数の情報リストがある場合に、すべてのリストに存在するユーザーのIDに基づいて共通のユーザー情報だけを抽出したいといった状況でこの関数が役立ちます。これにより、異なるデータソース間で整合性のあるデータを特定し、フィルタリングすることが可能になります。抽出される配列は、元の配列とは独立した新しい配列として生成されますので、元の配列が変更されることはありません。キーの比較のみが行われるため、値が異なる要素であってもキーが共通していれば抽出対象となります。

基本的な使い方

構文(syntax)

array_intersect_key(['key1' => 'value1', 'key2' => 'value2'], ['key2' => 'value3', 'key3' => 'value4']);

引数(parameters)

array $array, array ...$arrays

  • array $array: 比較の基準となる配列
  • array ...$arrays: 比較対象となる1つ以上の配列

戻り値(return)

array

配列のうち、キーが指定された配列のいずれかのキーと一致する要素のみを含む新しい配列を返します。

サンプルコード

PHP: array_intersect_keyで多次元配列をキーで抽出する

<?php

/**
 * array_intersect_key関数の使用例。
 * 複数の配列から、すべての配列に共通して存在するキーを持つ要素を抽出します。
 * この例では、多次元配列の最上位のキーを比較してフィルタリングする方法を示します。
 */

// サンプルデータ: 複数の商品の詳細情報を含む多次元配列
$allProducts = [
    'PROD_A001' => [
        'name' => 'スマートフォン',
        'price' => 50000,
        'category' => 'Electronics'
    ],
    'PROD_B002' => [
        'name' => 'ワイヤレスイヤホン',
        'price' => 15000,
        'category' => 'Electronics'
    ],
    'PROD_C003' => [
        'name' => 'スマートウォッチ',
        'price' => 25000,
        'category' => 'Wearable'
    ],
    'PROD_D004' => [
        'name' => 'タブレットPC',
        'price' => 40000,
        'category' => 'Electronics'
    ],
];

// 別のデータ: 在庫がある商品IDのリスト (値はキーの存在のみを示すため何でも良い)
$inStockProducts = [
    'PROD_A001' => true,
    'PROD_C003' => true,
    'PROD_E005' => true, // この商品IDは $allProducts には存在しません
];

// array_intersect_key() を使用して、$allProducts から $inStockProducts に
// 存在するキー(商品ID)を持つ商品データのみを抽出します。
// array_intersect_keyは、最初の配列のキーが、続く全ての配列にも存在する場合に、
// 最初の配列のそのキーと値を保持します。
$availableProducts = array_intersect_key($allProducts, $inStockProducts);

echo "--- 全商品データ ---" . PHP_EOL;
print_r($allProducts);
echo PHP_EOL;

echo "--- 在庫がある商品IDリスト ---" . PHP_EOL;
print_r($inStockProducts);
echo PHP_EOL;

echo "--- 在庫がある商品データ (array_intersect_keyでフィルタリング) ---" . PHP_EOL;
print_r($availableProducts);
echo PHP_EOL;

// 上記のコードを実行すると、`$availableProducts` には以下の内容が出力されます。
// `PROD_A001` と `PROD_C003` の商品データのみが抽出されます。
// `PROD_B002` と `PROD_D004` は `$inStockProducts` にキーが存在しないため除外されます。
// `PROD_E005` は `$allProducts` にキーが存在しないため、結果には含まれません。
/*
Array
(
    [PROD_A001] => Array
        (
            [name] => スマートフォン
            [price] => 50000
            [category] => Electronics
        )

    [PROD_C003] => Array
        (
            [name] => スマートウォッチ
            [price] => 25000
            [category] => Wearable
        )
)
*/

PHP 8のarray_intersect_key関数は、複数の配列間で共通して存在するキーを持つ要素を抽出するために使用されます。第一引数には基となる配列を、第二引数以降には比較対象となる配列を複数指定できます。この関数は、最初の配列のキーが、引数として渡された全ての比較対象配列にも存在する場合に、最初の配列からそのキーと値のペアを保持した新しい配列を返します。

サンプルコードでは、全ての商品情報を持つ多次元配列$allProductsと、在庫がある商品のIDリストを表す$inStockProductsを比較しています。array_intersect_key($allProducts, $inStockProducts)を実行すると、$allProductsの最上位のキー(商品ID)が$inStockProductsにも存在するかをチェックします。その結果、PROD_A001PROD_C003という商品IDは両方の配列に共通して存在するため、$allProductsからこれらの商品データが抽出され、$availableProductsに格納されます。PROD_B002PROD_D004$inStockProductsにキーが存在しないため結果から除外され、PROD_E005$allProductsに存在しないため、そもそも比較対象とならず結果には含まれません。このように、多次元配列の特定の階層のキーに基づいてデータを効率的にフィルタリングできる便利な関数です。

array_intersect_key関数は、複数の配列に共通するキーを持つ要素を、最初の配列から抽出する際に利用します。値は比較されず、キーの存在のみが判断基準となりますので、値の内容は結果に影響しません。多次元配列に適用した場合、比較されるのは最上位のキーのみです。内側の配列のキーや値は比較対象となりませんので、深さ方向で共通キーを抽出したい場合は別の方法を検討してください。戻り値は、共通するキーを持つ最初の配列の要素で構成されます。サンプルコードのように、特定の条件(ここでは在庫のある商品ID)で多次元配列の最上位要素をフィルタリングする際に非常に役立ちます。キーが存在しない要素は結果に含まれませんので、期待する結果が得られているか確認してください。

PHP array_intersect_key で共通キーを持つ要素を取得する

<?php

/**
 * array_intersect_keyの基本的な使用方法を示すサンプルコード。
 * 複数の配列のキーを比較し、最初の配列に存在し、かつ他のすべての配列にも存在するキーを持つ要素を返します。
 * 返される配列の要素は、最初の配列の値が使用されます。
 */

// 最初の基準となる配列
$array1 = [
    'fruit' => 'apple',
    'vegetable' => 'carrot',
    'meat' => 'beef',
    'dairy' => 'milk',
];

// 比較対象の配列1: 'fruit'と'meat'のキーが存在
$array2 = [
    'fruit' => 'orange',
    'spice' => 'pepper',
    'meat' => 'pork',
    'liquid' => 'water',
];

// 比較対象の配列2: 'fruit'と'dairy'のキーが存在
$array3 = [
    'fruit' => 'banana',
    'grain' => 'rice',
    'dairy' => 'cheese',
    'vegetable' => 'onion',
];

echo "--- 元の配列 ---" . PHP_EOL;
echo "配列1: " . print_r($array1, true);
echo "配列2: " . print_r($array2, true);
echo "配列3: " . print_r($array3, true);

// array_intersect_key を使用して、すべての配列に共通するキーを持つ要素を抽出
// 返される配列は$array1の値を使用します
$commonKeysWithValues = array_intersect_key($array1, $array2, $array3);

echo "--- array_intersect_keyの結果 ---" . PHP_EOL;
echo "すべての配列に共通するキーと、最初の配列(array1)からの値を持つ要素:" . PHP_EOL;
print_r($commonKeysWithValues);

// この例では、'fruit'のみがすべての配列に共通するキーです。
// したがって、結果は ['fruit' => 'apple'] となります。
// 'vegetable'はarray1とarray3にありますがarray2にはありません。
// 'meat'はarray1とarray2にありますがarray3にはありません。
// 'dairy'はarray1とarray3にありますがarray2にはありません。

?>

array_intersect_keyは、PHPで複数の配列のキーを比較し、すべての配列に共通して存在するキーを持つ要素を抽出する関数です。

引数には、最初に基準となる配列を一つ指定し、その後に比較対象となる配列を複数指定します。この関数は、最初の基準配列のキーと、それに続くすべての比較対象配列のキーを照合します。

戻り値は新しい配列で、すべての入力配列に共通するキーを持つ要素のみが含まれます。このとき、返される配列の要素が持つ値は、常に最初の引数として渡された基準配列から取得されます。

サンプルコードでは、$array1$array2$array3の3つの配列を比較しています。これらの配列すべてに共通して存在するキーは'fruit'だけです。そのため、array_intersect_key($array1, $array2, $array3)の実行結果は、キーが'fruit'で、値が最初の配列$array1から取得された'apple'となる配列になります。このように、複数のデータセットから共通の識別子(キー)を持つ項目を効率的に見つけ出す際に利用されます。

array_intersect_keyは、複数の配列に共通して存在する「キー」を持つ要素を抽出する関数です。この関数の重要な注意点として、戻り値の配列の「値」は、常に第一引数で指定した最初の配列の値が採用されることを理解しておきましょう。比較対象の他の配列に同じキーが存在しても、その値は結果に反映されません。また、キーの比較は厳密に行われますので、キーの型が異なる場合は共通とは見なされない可能性があります。可変長の引数で任意の数の配列を渡せますが、すべての配列に共通するキーでなければ結果に含まれません。対象のキーが確実にすべての配列に存在するか確認して利用してください。

【PHP8.x】array_intersect_key関数の使い方 | いっしー@Webエンジニア