array_uintersect

関数の概要

PHPの array_uintersect 関数は、複数の配列からユーザー定義関数による比較を用いて共通する要素を取得します。標準の array_intersect と違い、比較方法を自分でカスタマイズできるため、より細かい条件で配列の共通部分を取得したい場合に便利です。

パラメータの説明

  • array1: 比較対象となる最初の配列です。
  • array2, ...: 比較対象の二番目以降の配列を1つ以上指定します。
  • data_compare_func: 2つの値を比較するためのユーザー定義関数の名前。引数2つを受け取り、比較結果を整数で返します(strcmpなどと同様の規則)。

戻り値

最初の配列 array1 を基準にし、他の配列と data_compare_func による比較で共通すると判定された要素のみを含む新しい配列を返します。元のキーは保持されます。

使用例

基本的な使い方(数値の大小比較)

<?php
$array1 = [1, 5, 10, 20];
$array2 = [10, 20, 30, 40];

// 比較関数(数値の大小に基づく)
function compare_numbers($a, $b) {
    return $a - $b;
}

$result = array_uintersect($array1, $array2, 'compare_numbers');
print_r($result);
?>

この例では、数値同士を単純に引き算する比較関数を使っています。結果は 1020 のみが共通要素として返されます。

文字列を大文字小文字を区別せず比較する

<?php
$array1 = ['Apple', 'Banana', 'Grape'];
$array2 = ['apple', 'Orange', 'BANANA'];

// 大文字小文字を無視する比較関数
function case_insensitive_compare($a, $b) {
    return strcasecmp($a, $b);
}

$result = array_uintersect($array1, $array2, 'case_insensitive_compare');
print_r($result);
?>

大文字小文字を区別せず比較することで、’Apple’ と ‘apple’、’Banana’ と ‘BANANA’ が共通要素として認識されます。

カスタムオブジェクトの比較

<?php
class User {
    public $id;
    public $name;
    public function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

$array1 = [new User(1, 'Alice'), new User(2, 'Bob')];
$array2 = [new User(2, 'Bob'), new User(3, 'Charlie')];

// IDで比較する関数
function compare_users_by_id($a, $b) {
    return $a->id - $b->id;
}

$result = array_uintersect($array1, $array2, 'compare_users_by_id');
print_r($result);
?>

オブジェクトの共通要素をIDの比較で求めています。IDが一致するユーザー(この場合はID=2のBob)のみが返されます。

関連する関数

  • array_intersect — 配列の共通部分を取得(標準比較)
  • array_intersect_uassoc — キーと値をユーザー定義関数で比較
  • array_uintersect_assoc — 値をユーザー定義関数、キーは通常比較

まとめ

array_uintersect は、配列の共通要素を取得する際に、ユーザー定義の比較ロジックを適用できる強力な関数です。文字列の大文字小文字を無視した比較や、オブジェクトの特定フィールドでの比較など、標準の比較方法では対応しきれないケースで活用すると便利です。配列操作を柔軟に行いたい場合にぜひ覚えておきたい関数です。