array_udiff_assoc

関数の概要

PHPの array_udiff_assoc 関数は、複数の配列を比較して、キーと値の組み合わせの差分をユーザー定義のコールバック関数で比較しながら取得するための関数です。キーと値の両方を比較対象にできるため、より細かく差分を抽出したい場合に便利です。

パラメータの説明

  • array $array1 – 比較対象の最初の配列。
  • array ...$arrays – 比較される他の配列(1つ以上指定可能)。
  • callable $value_compare_func – 値を比較するためのユーザー定義コールバック関数。この関数は2つの値を受け取り、比較結果を整数で返します(0のいずれか)。

戻り値

最初の配列 $array1 に存在し、かつ他の配列には存在しないキーと値の組み合わせの配列を返します。キーと値の両方をユーザー定義の比較で判定するため、単純な差分より精密な比較が可能です。

使用例

基本的な使い方

<?php
$array1 = ['a' => 1, 'b' => 2, 'c' => 3];
$array2 = ['a' => 1, 'b' => 20, 'd' => 4];

// 値を厳密に比較する関数
function compare_values($val1, $val2) {
    if ($val1 === $val2) return 0;
    return ($val1 < $val2) ? -1 : 1;
}

$result = array_udiff_assoc($array1, $array2, 'compare_values');
print_r($result);
?>

この例では、配列 $array1$array2 を比較し、キーと値が異なる要素を抽出しています。結果は b => 2c => 3 になります。

複数配列との比較

<?php
$array1 = ['x' => 5, 'y' => 10, 'z' => 15];
$array2 = ['x' => 5, 'y' => 10];
$array3 = ['z' => 20];

// 大小を判定する比較関数
function cmp($a, $b) {
    return $a - $b;
}

$result = array_udiff_assoc($array1, $array2, $array3, 'cmp');
print_r($result);
?>

この例では、3つの配列を比較しています。結果は z => 15 となり、値が異なることが検出されます。

文字列値の比較とキーの違いも検出

<?php
$array1 = ['a' => 'Apple', 'b' => 'Banana'];
$array2 = ['a' => 'apple', 'b' => 'Banana'];
$array3 = ['a' => 'Apple', 'c' => 'Cherry'];

// 大文字小文字を区別しない比較関数
function str_case_compare($str1, $str2) {
    $str1 = strtolower($str1);
    $str2 = strtolower($str2);
    return strcmp($str1, $str2);
}

$result = array_udiff_assoc($array1, $array2, $array3, 'str_case_compare');
print_r($result);
?>

この例では、値の比較に大文字小文字を無視した比較関数を使っています。キーが異なる c は差分に含まれませんが、値に違いがあった場合キーも考慮して差分が検出されます。

関連する関数

  • array_diff_assoc – キーと値を厳密に比較して差分を返す(ユーザー定義比較なし)
  • array_udiff – 値のみをユーザー定義関数で比較して差分を返す
  • array_diff_key – キーのみで差分を比較する
  • array_intersect_assoc – キーと値が一致する要素のみを取得する

まとめ

array_udiff_assoc は、配列のキーと値の両方をユーザー定義関数で比較して差分を取得できる強力な関数です。標準の比較関数では対応しづらいカスタムな比較条件を実装できるため、たとえばオブジェクトの比較や特定のルールに基づく文字列比較などに役立ちます。複数の配列で差分を取得したい場合にも使い勝手がよく、実務での配列の差分抽出にはぜひ覚えておきたい関数です。