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

作成日: 更新日:

array_diff関数は、複数の配列を比較し、最初の配列にのみ存在する要素を抽出して新しい配列として返す関数です。この関数は、比較対象となる少なくとも2つの配列を引数として受け取ります。動作の原理として、最初の配列の各要素の値を、2番目以降のすべての配列の要素の値と比較します。この際、要素のキーは比較の対象とはならず、値のみが比較されます。もし最初の配列のある要素の値が、2番目以降のどの配列にも存在しない場合、その要素は結果の配列に含まれます。つまり、最初の配列から、他の配列と共通する値を持つ要素を除外した結果が返されます。結果として返される配列のキーは、最初の配列が持っていた元のキーが保持されます。例えば、商品在庫リストから、すでに販売済みの商品リストを除外して、現在購入可能な商品を特定するような場面でこの関数は非常に役立ちます。PHP 8.4の標準拡張機能として提供されており、配列の差分を効率的に計算し、データ処理を簡潔に行うために利用されます。

基本的な使い方

構文(syntax)

<?php
$array1 = ["apple", "banana", "cherry", "date"];
$array2 = ["banana", "date", "elderberry"];
$difference = array_diff($array1, $array2);
print_r($difference);
?>

引数(parameters)

array $array, array ...$arrays

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

戻り値(return)

array

array_diff関数は、配列から指定した配列に含まれる値を除いた差分を新しい配列として返します。

サンプルコード

PHP array_diff_assoc でキーと値が異なる要素を抽出する

<?php

/**
 * array_diff_assoc() は、最初の配列に存在するが、
 * 他の配列にはキーと値の両方が完全に一致する要素が存在しないエントリを返します。
 * これは、キーも値も両方が一致しないと「差分」と見なされることを意味します。
 * キーの型も比較対象となります。
 */

// 最初の配列を定義します。
// 各要素はキーと値のペアを持ちます。
$array1 = [
    "fruit_a" => "apple",
    "fruit_b" => "banana",
    "fruit_c" => "cherry",
    "color_a" => "red",
    0          => "grape", // 数値キーの例
    "1"        => "lemon", // 文字列キーの例
];

// 比較対象の2番目の配列を定義します。
// array1との違いに注目してください。
$array2 = [
    "fruit_a" => "apple",    // キーと値がarray1と一致するため、差分ではない
    "fruit_b" => "grape",    // キーは同じだが値が異なるため、差分である
    "fruit_d" => "date",     // array1には存在しないキーなので、差分ではない
    "color_a" => "blue",     // キーは同じだが値が異なるため、差分である
    0          => "grape",    // キーと値がarray1と一致するため、差分ではない
    1          => "lemon",    // キーの型がarray1と異なるため、差分である (array1は文字列"1"、array2は数値1)
];

// array_diff_assoc() を使用して、
// array1に存在するが、array2にはキーと値が完全に一致する要素がないエントリを見つけます。
$diffResult = array_diff_assoc($array1, $array2);

echo "array_diff_assoc の結果:\n";
print_r($diffResult);

/*
実行結果の解説:
Array
(
    [fruit_b] => banana
    [fruit_c] => cherry
    [color_a] => red
    [1] => lemon
)

- "fruit_a" => "apple": array1とarray2で完全に一致するため、結果には含まれません。
- "fruit_b" => "banana": array1では"banana"ですが、array2ではキー"fruit_b"の値が"grape"です。
  値が異なるため、array1のこの要素はarray2に存在しないと判断され、結果に含まれます。
- "fruit_c" => "cherry": array1には存在しますが、array2にはキー"fruit_c"が存在しないため、結果に含まれます。
- "color_a" => "red": array1では"red"ですが、array2ではキー"color_a"の値が"blue"です。
  値が異なるため、array1のこの要素はarray2に存在しないと判断され、結果に含まれます。
- 0 => "grape": array1とarray2で完全に一致するため、結果には含まれません。
- "1" => "lemon": array1ではキーが文字列"1"ですが、array2ではキーが数値1です。
  キーの型が異なるため、array1のこの要素はarray2に存在しないと判断され、結果に含まれます。
*/

PHPのarray_diff_assoc関数は、複数の配列を比較し、最初の配列に存在する要素のうち、比較対象となる他のどの配列にもキーと値の両方が完全に一致する要素がないものを抽出して新しい配列として返します。この関数は、引数として最初の配列(基準となる配列)と、比較したい1つ以上の配列を受け取ります。戻り値は、差分と判断された要素のみを含む新しい配列です。

この関数では、要素が「差分」とみなされる条件は、キーと値のペアが完全に一致しない場合です。特に重要なのは、キーの値だけでなく、キーのデータ型も厳密に比較の対象となる点です。例えば、文字列のキー"1"と数値のキー1は異なるものとして扱われます。

サンプルコードでは、$array1$array2を比較しています。$array1"fruit_b" => "banana"は、$array2に同じキー"fruit_b"が存在しますが値が"grape"と異なるため、差分として抽出されます。また、$array1"fruit_c" => "cherry"は、$array2にキー自体が存在しないため、差分となります。さらに、$array1の"1" => "lemon"は、$array2には数値キーの1 => "lemon"として存在しますが、キーの型が異なるため、$array1の要素が差分として結果に含まれます。このように、array_diff_assocは厳密な比較を行うため、期待する結果を得るためにはキーと値、そしてキーの型の両方に注意が必要です。

array_diff_assocは、配列の差分をキーと値の両方で厳密に比較して検出します。特に重要な点として、キーのまでが比較対象となるため、例えば数値キー1と文字列キー"1"は異なるものとして扱われます。この厳密な比較により、見た目が同じでも型が異なれば差分として判断されることに注意が必要です。結果として返されるのは、最初の配列に存在する要素のうち、比較対象の他のすべての配列にキーと値が完全に一致する要素が見つからなかったものです。比較対象の配列にのみ存在する要素は結果に含まれません。複数の配列を比較することもできますが、多次元配列には直接適用できませんので、必要に応じて別途処理を実装してください。この関数を理解することで、配列の要素の有無だけでなく、その整合性も正確に確認できます。

PHP array_diff_key でキーの差分を取得する

<?php

/**
 * array_diff_key関数の使用例を示します。
 * この関数は、最初の配列とそれ以降の配列のキーを比較し、
 * 最初の配列にのみ存在するキーとその値からなる配列を返します。
 *
 * @return void
 */
function demonstrateArrayDiffKey(): void
{
    // 例1: 2つの配列のキーを比較
    echo "--- 例1: 2つの配列のキーを比較 ---" . PHP_EOL;

    // 最初の配列を定義します
    $array1 = [
        'apple'  => 1,
        'banana' => 2,
        'cherry' => 3,
        'date'   => 4,
    ];
    echo "最初の配列 (\$array1):" . PHP_EOL;
    print_r($array1);

    // 比較対象の配列を定義します
    $array2 = [
        'banana' => 20, // キー 'banana' は array1 にも存在する
        'date'   => 40,   // キー 'date' は array1 にも存在する
        'elder'  => 50,   // キー 'elder' は array1 に存在しない
    ];
    echo "比較対象の配列 (\$array2):" . PHP_EOL;
    print_r($array2);

    // array_diff_keyを使用して、array1にのみ存在するキーの要素を抽出します。
    // 'apple' と 'cherry' のキーは array2 に存在しないため、これらの要素が結果に含まれます。
    $result1 = array_diff_key($array1, $array2);
    echo "array_diff_keyの結果 (最初の配列にのみ存在するキーの要素):" . PHP_EOL;
    print_r($result1);
    echo PHP_EOL;

    // 例2: 複数の配列のキーを比較
    echo "--- 例2: 複数の配列のキーを比較 ---" . PHP_EOL;

    // 最初の配列
    $arrayA = [
        'color'    => 'red',
        'size'     => 'M',
        'material' => 'cotton',
        'brand'    => 'XYZ',
    ];
    echo "最初の配列 (\$arrayA):" . PHP_EOL;
    print_r($arrayA);

    // 比較対象の配列1
    $arrayB = [
        'size'     => 'L',
        'material' => 'silk',
        'pattern'  => 'striped',
    ];
    echo "比較対象の配列1 (\$arrayB):" . PHP_EOL;
    print_r($arrayB);

    // 比較対象の配列2
    $arrayC = [
        'color' => 'blue',
        'price' => 100,
    ];
    echo "比較対象の配列2 (\$arrayC):" . PHP_EOL;
    print_r($arrayC);

    // array_diff_keyは、arrayAのキーのうち、arrayBにもarrayCにも存在しないキーを持つ要素を返します。
    // - 'color' は arrayC に存在する
    // - 'size' は arrayB に存在する
    // - 'material' は arrayB に存在する
    // - 'brand' は arrayB と arrayC のどちらにも存在しない
    // よって、結果は 'brand' の要素のみとなります。
    $result2 = array_diff_key($arrayA, $arrayB, $arrayC);
    echo "array_diff_keyの結果 (最初の配列にのみ存在するキーの要素):" . PHP_EOL;
    print_r($result2);
    echo PHP_EOL;
}

// demonstrateArrayDiffKey関数の使用例を実行します
demonstrateArrayDiffKey();

?>

PHP 8で利用できるarray_diff_key関数は、複数の配列のキーを比較し、最初の配列にのみ存在するキーを持つ要素を抽出する際に使用します。この関数は、最初の引数に指定された配列を基準とし、その後に続く引数で渡された一つ以上の配列と比較を行います。戻り値として、最初の配列のキーのうち、比較対象となる他のどの配列にも存在しないキーとその値からなる新しい配列を返します。

引数$arrayは比較の基準となる最初の配列であり、...$arraysは最初の配列と比較したい一つ以上の配列です。この関数は、要素の値自体ではなく、キーの存在のみを比較の対象とします。

例えば、サンプルコードの例1では、$array1$array2のキーを比較しています。array_diff_key($array1, $array2)を実行すると、$array1に存在するキーのうち、$array2には存在しないキーである'apple''cherry'を持つ要素が結果として得られます。

また、この関数は複数の配列を同時に比較することも可能です。例2のようにarray_diff_key($arrayA, $arrayB, $arrayC)と指定した場合、$arrayAのキーのうち、$arrayB$arrayCのどちらにも存在しないキーを持つ要素のみが抽出されます。これにより、ある配列にだけ存在するユニークなキーを持つ要素を簡単に特定できます。

array_diff_key関数は、配列の「キー」のみを比較して差分を抽出します。値は比較対象になりません。結果として返されるのは、最初の配列に存在し、かつそれ以降に指定された全ての比較対象配列にないキーを持つ要素です。最初の配列を基準とするため、比較対象にしかないキーは結果に含まれません。キーの比較は厳密に行われ、整数型と文字列型は異なるものとして扱われる点にも注意が必要です。

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