データの比較にコールバック関数を用い、配列の差を計算する

# array_udiff

(PHP 5, PHP 7)

array_udiff — データの比較にコールバック関数を用い、配列の差を計算する

### 説明

array_udiff ( array `$array1` , array `$array2` [, array `$...` ], callable `$value_compare_func` ) : array

データの比較にコールバック関数を用い、配列の差を計算します。 この関数は array_diff() と異なり、 データの比較に内部関数を利用します。

### パラメータ

`array1`

  最初の配列。

`array2`

  2 番目の配列。

`value_compare_func`

  比較用のコールバック関数。

  比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。PHP 7.0.0 より前のバージョンでは、この整数が -2147483648 から 2147483647 までの範囲におさまる必要がありました。

  callback ( mixed `$a`, mixed `$b` ) : int

### 返り値

他の引数のいずれにも存在しない `array1` の値の全てを有する配列を返します。

### 例

例1 array_udiff() で stdClass オブジェクトを使う例

`<?php
// 比較する配列
$array1 = array(new stdclass, new stdclass,
new stdclass, new stdclass,
);
$array2 = array(
new stdclass, new stdclass,
);
// オブジェクトにプロパティを設定します
$array1[0]->width = 11; $array1[0]->height = 3;
$array1[1]->width = 7; $array1[1]->height = 1;
$array1[2]->width = 2; $array1[2]->height = 9;
$array1[3]->width = 5; $array1[3]->height = 7;
$array2[0]->width = 7; $array2[0]->height = 5;
$array2[1]->width = 9; $array2[1]->height = 2;
function compare_by_area($a, $b) {
$areaA = $a->width * $a->height;
$areaB = $b->width * $b->height;
if ($areaA < $areaB) {
return -1;
} elseif ($areaA > $areaB) {
return 1;
} else {
return 0;
}
}
print_r(array_udiff($array1, $array2, 'compare_by_area'));
?>`

上の例の出力は以下となります。

    Array
    (
        [0] => stdClass Object
            (
                [width] => 11
                [height] => 3
            )

        [1] => stdClass Object
            (
                [width] => 7
                [height] => 1
            )

    )

例2 array_udiff() で DateTime オブジェクトを使う例

`<?php
class MyCalendar {
public $free = array();
public $booked = array();
public function __construct($week = 'now') {
$start = new DateTime($week);
$start->modify('Monday this week midnight');
$end = clone $start;
$end->modify('Friday this week midnight');
$interval = new DateInterval('P1D');
foreach (new DatePeriod($start, $interval, $end) as $freeTime) {
$this->free[] = $freeTime;
}
}
public function bookAppointment(DateTime $date, $note) {
$this->booked[] = array('date' => $date->modify('midnight'), 'note' => $note);
}
public function checkAvailability() {
return array_udiff($this->free, $this->booked, array($this, 'customCompare'));
}
public function customCompare($free, $booked) {
if (is_array($free)) $a = $free['date'];
else $a = $free;
if (is_array($booked)) $b = $booked['date'];
else $b = $booked;
if ($a == $b) {
return 0;
} elseif ($a > $b) {
return 1;
} else {
return -1;
}
}
}
// 毎週の予約用のカレンダーを作ります
$myCalendar = new MyCalendar;
// 今週の予約を入れます
$myCalendar->bookAppointment(new DateTime('Monday this week'), "Cleaning GoogleGuy's apartment.");
$myCalendar->bookAppointment(new DateTime('Wednesday this week'), "Going on a snowboarding trip.");
$myCalendar->bookAppointment(new DateTime('Friday this week'), "Fixing buggy code.");
// 空きが何日あるかを調べるため、$booked の日数と $free の日数を比べます
echo "I'm available on the following days this week...\n\n";
foreach ($myCalendar->checkAvailability() as $free) {
echo $free->format('l'), "\n";
}
echo "\n\n";
echo "I'm busy on the following days this week...\n\n";
foreach ($myCalendar->booked as $booked) {
echo $booked['date']->format('l'), ": ", $booked['note'], "\n";
}
?>`

上の例の出力は以下となります。

    I'm available on the following days this week...

    Tuesday
    Thursday

    I'm busy on the following days this week...

    Monday: Cleaning GoogleGuy's apartment.
    Wednesday: Going on a snowboarding trip.
    Friday: Fixing buggy code.

### 注意

> 注意: この関数は n 次元配列の一つの次元しかチェックしないことに注意してください。 もちろん、array_udiff($array1[0], $array2[0], "data_compare_func"); のようにすることでより深い次元でのチェックもできます。

### 参考

- array_diff() - 配列の差を計算する
- array_diff_assoc() - 追加された添字の確認を含めて配列の差を計算する
- array_diff_uassoc() - ユーザーが指定したコールバック関数を利用し、 追加された添字の確認を含めて配列の差を計算する
- array_udiff_assoc() - データの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
- array_udiff_uassoc() - データと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
- array_intersect() - 配列の共通項を計算する
- array_intersect_assoc() - 追加された添字の確認も含めて配列の共通項を確認する
- array_uintersect() - データの比較にコールバック関数を用い、配列の共通項を計算する
- array_uintersect_assoc() - データの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
- array_uintersect_uassoc() - データと添字の比較に個別のコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する