배열 array_udiff

(PHP 5, PHP 7, PHP 8)

array_udiff — 데이터 비교를 위한 콜백 함수를 사용하여 배열의 차이를 계산합니다.


설명

array_udiff(array $array, array ...$arrays, callable $value_compare_func): array

데이터 비교를 위한 콜백 함수를 사용하여 배열의 차이를 계산합니다. 이것은 데이터를 비교하기 위해 내부 함수를 사용하는 array_diff()와 다릅니다.


매개변수

array
첫 번째 배열입니다.
arrays
비교할 배열입니다.
value_compare_func
콜백 비교 함수.

비교 함수는 첫 번째 인수가 두 번째 인수보다 각각 작거나 같거나 큰 것으로 간주되는 경우 0보다 작거나 같거나 큰 정수를 반환해야 합니다.

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


반환 값

다른 인수에 없는 array의 모든 값을 포함하는 배열을 반환합니다.


Examples

예제 #1 stdClass 객체를 사용하는 array_udiff() 예제

                  
<?php
// Arrays to compare
$array1 = array(new stdclass, new stdclass,
                new stdclass, new stdclass,
               );

$array2 = array(
                new stdclass, new stdclass,
               );

// Set some properties for each object
$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 DateTime 객체를 사용하는 array_udiff() 예제

                  
<?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;
        }
    }
}

// Create a calendar for weekly appointments
$myCalendar = new MyCalendar;

// Book some appointments for this week
$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.");

// Check availability of days by comparing $booked dates against $free dates
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() - 추가 인덱스 검사로 배열의 교집합을 계산하고 별도의 콜백 함수로 데이터와 인덱스를 비교합니다.