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


(PHP 5)

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

Описание

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

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

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

array1

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

array2

Второй массив.

value_compare_func

Callback-функция, используемая для сравнения.

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим чем второй.

int callback ( mixed $a, mixed $b )

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

Возвращает массив, содержащий все элементы 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'), "Уборка квартиры сотрудника 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-функцию