Вычисляет расхождение массивов, используя для сравнения callback-функцию

# array_udiff

(PHP 5, PHP 7, PHP 8)

array_udiff — Вычисляет расхождение массивов, используя для сравнения callback-функцию

### Описание

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

Вычисляет расхождение массивов, используя для сравнения данных callback-функцию. Поведение этой функции отличается от поведения функции array_diff(), которая сравнивает данные через внутреннюю функцию.

### Список параметров

`array`

  Первый массив.

`arrays`

  Массивы для сравнения.

`value_compare_func`
  Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.
  function callback(mixed `$a`, mixed `$b`): int
  Предостережение

  При возврате из функции сравнения нецелых значений наподобие float PHP внутренне приведёт значение, которое возвращает callback-функции, к типу int. Поэтому значения наподобие `0.99` и `0.1` приводятся к целочисленному значению `0` и сравниваются как равные.

  Предостережение

  Callback-функция сортировки должна обрабатывать любое значение из любого массива в любом порядке независимо от первоначального порядка. Причина состоит в том, что каждый отдельный массив вначале сортируется, а затем сравнивается с другими массивами. Например:

      <?php

      $arrayA = ["string", 1];
      $arrayB = [["value" => 1]];

      // В переменных $item1 и $item2 возможны значения "string", 1 или ["value" => 1]
      $compareFunc = static function ($item1, $item2) {
          $value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
          $value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
          return $value1 <=> $value2;
      };

### Возвращаемые значения

Возвращает массив (array), содержащий элементы аргумента `array`, которых нет ни в одном другом аргументе.

### Примеры

Пример #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'), "Уборка квартиры сотрудника Google.");
    $myCalendar->bookAppointment(new DateTime('Wednesday this week'), "Катание на сноуборде.");
    $myCalendar->bookAppointment(new DateTime('Friday this week'), "Борьба с багами в коде.");

    // Проверка доступности дней путём сравнения дат в переменной $booked с датами переменной $free
    echo "Я доступен в следующие дни на этой неделе...\n\n";
    foreach ($myCalendar->checkAvailability() as $free) {
        echo $free->format('l'), "\n";
    }
    echo "\n\n";
    echo "Я занят в следующие дни на этой неделе...\n\n";
    foreach ($myCalendar->booked as $booked) {
        echo $booked['date']->format('l'), ": ", $booked['note'], "\n";
    }

    ?>

Результат выполнения приведённого примера:

    Я доступен в следующие дни на этой неделе...

    Tuesday
    Thursday

    Я занят в следующие дни на этой неделе...

    Monday: Уборка квартиры сотрудника Google.
    Wednesday: Катание на сноуборде.
    Friday: Борьба с багами в коде.

### Примечания

> Замечание: Обратите внимание, что функция обрабатывает только первый уровень многомерного массива. Значения на вложенных уровнях обрабатывают, например, так: `array_udiff($array1[0], $array2[0], "data_compare_func");`.

### Смотрите также

- array_diff() - Вычисляет расхождение массивов
- array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
- array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
- array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
- array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, сравнивая значения и индексы через callback-функцию
- array_intersect() - Вычисляет пересечение массивов
- array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
- array_uintersect() - Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
- array_uintersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
- array_uintersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений отдельные callback-функции

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open