(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), приведёт к внутреннему
приведению возвращаемого значения 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");
.