array_uintersect_uassoc

関数の概要

PHPの array_uintersect_uassoc 関数は、複数の配列を比較し、キーと値の両方をユーザー定義のコールバック関数を使って比較した上で、すべての配列に共通する要素を取得します。キーと値の比較に独自ルールを適用したい場面で便利な関数です。

パラメータの説明

  • array $array1 — 比較対象の最初の配列。結果配列の基準となります。
  • array ...$arrays — 比較するその他の配列(可変長引数)。複数指定可能です。
  • callable $value_compare_func — 配列の値を比較するためのコールバック関数。2つの値を引数に取り、
    • 0を返した場合は同じとみなす。
    • 0未満の場合は第1引数の値が小さいとみなす。
    • 0より大きい場合は第2引数の値が小さいとみなす。
  • callable $key_compare_func — 配列のキーを比較するためのコールバック関数。値比較と同様のルールで比較します。

戻り値

すべての配列においてキーと値の両方が一致(比較関数で0を返す)する要素だけを含む新しい配列を返します。なければ空の配列を返します。

使用例

基本的な使い方

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

$result = array_uintersect_uassoc(
    $array1,
    $array2,
    function($v1, $v2) {
        return $v1 - $v2;
    },
    function($k1, $k2) {
        return strcmp($k1, $k2);
    }
);

print_r($result);
?>

このコードでは、値が等しいかつキーが一致する要素だけを取得します。結果は ['a' => 1] となります。

大文字・小文字を区別しないキー比較

<?php
$array1 = ['A' => 100, 'B' => 200];
$array2 = ['a' => 100, 'b' => 300];

$result = array_uintersect_uassoc(
    $array1,
    $array2,
    function($v1, $v2) {
        return $v1 - $v2;
    },
    function($k1, $k2) {
        return strcasecmp($k1, $k2);
    }
);

print_r($result);
?>

キー比較を大文字・小文字無視で行うため strcasecmp を使用しています。値が一致する ‘A’/’a’ のみ結果に含まれます。

値の近似一致を許容する比較関数

<?php
$array1 = ['x' => 10, 'y' => 20, 'z' => 30];
$array2 = ['x' => 12, 'y' => 18, 'z' => 40];

$valueCompare = function($v1, $v2) {
    $diff = $v1 - $v2;
    return (abs($diff) <= 2) ? 0 : $diff;
};

$keyCompare = function($k1, $k2) {
    return strcmp($k1, $k2);
};

$result = array_uintersect_uassoc($array1, $array2, $valueCompare, $keyCompare);

print_r($result);
?>

この例では、値の差が2以内なら「等しい」とみなし共通要素とします。そのため ‘x’ と ‘y’ の要素が結果に含まれます。

関連する関数

  • array_intersect_uassoc — ユーザー定義のキー比較で配列の共通要素を取得
  • array_uintersect — ユーザー定義の値比較で配列の共通要素を取得
  • array_intersect_assoc — キーと値が一致する要素を取得

まとめ

array_uintersect_uassoc は、配列のキーと値をそれぞれユーザー定義関数で比較することで、より柔軟に共通要素を抽出できる強力な関数です。ケースに応じてキーや値の比較方法をカスタマイズする際に特に有用で、たとえば大文字小文字の区別を変えたい場合や値の近似一致を許容したい場合など、実務でも活用価値が高いです。PHPで複雑な配列比較をする際にはぜひ覚えておきたい関数の1つです。