(PHP 5, PHP 7, PHP 8)
array_udiff_uassoc — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
$array
,...$arrays
,$value_compare_func
,$key_compare_func
Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию.
Обратите внимание, что в отличие от функций array_diff() и array_udiff() при сравнении значений также сравниваются и ключи.
array
Первый массив.
arrays
Массивы для сравнения.
value_compare_func
Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.
При возврате из функции сравнения нецелых значений наподобие float
PHP внутренне приведёт значение, которое возвращает callback-функции, к типу int.
Поэтому значения наподобие 0.99
и 0.1
приводятся к целочисленному значению 0
и сравниваются как равные.
Callback-функция сортировки должна обрабатывать любое значение из любого массива в любом порядке независимо от первоначального порядка. Причина состоит в том, что каждый отдельный массив вначале сортируется, а затем сравнивается с другими массивами. Например:
<?php
$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 and $item2 can be any of "string", 1 or ["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;
};
?>
key_compare_func
Сравнение ключей (индексов) выполняется также callback-функцией
key_compare_func
. Это поведение отличается
от поведения функции array_udiff_assoc(),
которая сравнивает индексы через внутреннюю функцию.
Возвращает массив (array),
содержащий элементы аргумента array
,
которых нет ни в одном другом аргументе.
Пример #1 Пример использования функции array_udiff_uassoc()
<?php
class cr {
private $priv_member;
function __construct($val)
{
$this->priv_member = $val;
}
static function comp_func_cr($a, $b)
{
if ($a->priv_member === $b->priv_member) return 0;
return ($a->priv_member > $b->priv_member)? 1:-1;
}
static function comp_func_key($a, $b)
{
if ($a === $b) return 0;
return ($a > $b)? 1:-1;
}
}
$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23), 1=> new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr(3), 1=> new cr(4), 2 => new cr(-15),);
$result = array_udiff_uassoc($a, $b, array("cr", "comp_func_cr"), array("cr", "comp_func_key"));
print_r($result);
?>
Результат выполнения приведённого примера:
Array ( [0.1] => cr Object ( [priv_member:private] => 9 ) [0.5] => cr Object ( [priv_member:private] => 12 ) [0] => cr Object ( [priv_member:private] => 23 ) )
В приведённом примере видно, что пара "1" => new cr(4)
есть в обоих массивах, и поэтому её нет в выводе функции.
Функция будет работать, только если ей предоставили две функции обратного вызова.
Замечание: Обратите внимание, что функция обрабатывает только первый уровень многомерного массива. Значения на вложенных уровнях обрабатывают, например, так:
array_udiff_uassoc($array1[0], $array2[0], "data_compare_func", "key_compare_func");
.