array_uintersect
(PHP 5)
array_uintersect — Вычислить пересечение массивов, используя для сравнения значений функцию обратного вызова
Описание
array_uintersect() возвращает массив, содержащий все значения параметра array1 присутствующие во всех последующих аргументах. Значения сравниваются при помощи функции обратного вызова.
Пример #1 Пример использования array_uintersect()
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");
print_r(array_uintersect($array1, $array2, "strcasecmp"));
?>
Результат выполнения данного примера:
Array ( [a] => green [b] => brown [0] => red )
Для сравнения используется функция, определённая пользователем. Она должна возвращать целое число меньшее, равное или большее нуля, если первый параметр, соответственно, должен считаться меньше, равен или больше второго.
См. также array_intersect(), array_uintersect_assoc(), array_intersect_uassoc() и array_uintersect_uassoc().
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения, относящиеся к переменным и типам
- Массивы
- array_change_key_case
- array_chunk
- array_column
- array_combine
- array_count_values
- array_diff_assoc
- array_diff_key
- array_diff_uassoc
- array_diff_ukey
- array_diff
- array_fill_keys
- array_fill
- array_filter
- array_flip
- array_intersect_assoc
- array_intersect_key
- array_intersect_uassoc
- array_intersect_ukey
- array_intersect
- array_key_exists
- array_keys
- array_map
- array_merge_recursive
- array_merge
- array_multisort
- array_pad
- array_pop
- array_product
- array_push
- array_rand
- array_reduce
- array_replace_recursive
- array_replace
- array_reverse
- array_search
- array_shift
- array_slice
- array_splice
- array_sum
- array_udiff_assoc
- array_udiff_uassoc
- array_udiff
- array_uintersect_assoc
- array_uintersect_uassoc
- array_uintersect
- array_unique
- array_unshift
- array_values
- array_walk_recursive
- array_walk
- array
- arsort
- asort
- compact
- count
- current
- each
- end
- extract
- in_array
- key_exists
- key
- krsort
- ksort
- list
- natcasesort
- natsort
- next
- pos
- prev
- range
- reset
- rsort
- shuffle
- sizeof
- sort
- uasort
- uksort
- usort
Коментарии
I want to stress that in the user function, you do need to return either a 1 or a -1 properly; you cannot simply return 0 if the results are equal and 1 if they are not.
The following code is incorrect:
<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
{
return 0;
}
return 1;
}
$a1=array(1, 2, 4);
$a2=array(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>
This code is correct:
<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
{
return 0;
}
if ($v1 > $v2) return 1;
return -1;
}
$a1=array(1, 2, 4);
$a2=array(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>
As for the other "compare function" callbacks, the return value from the callback function doesn't need to be -1, 0, or 1.
cmp($a,$b) just needs to be <0, =0, or >0 depending on whether $a<$b, $a=$b, or $a>$b.
When trying to do a case insensitive comparison between arrays of words, the strcasecmp function works very nicely with this one like so:
$arr1 = array('blue', 'green', 'red');
$arr2 = array('BLUE', 'Purple', 'Red');
$loose_matches = array_uintersect($arr1, $arr2, 'strcasecmp');
print_r($loose_matches) // array('blue', 'red');
If you're rolling your own comparison function, keep in mind that the spaceship operator (i.e. <=>) can be your best friend. It's been around since PHP7. https://www.php.net/manual/en/language.operators.comparison.php
So, for instance, instead of a clunky function like:
<?php
function myFunction($v1, $v2) {
if ($v1 === $v2) {
return 0;
}
if ($v1 > $v2) return 1;
return -1;
}
?>
You can simplify it to:
<?php
function myFunction($v1, $v2) {
return $v1 <=> $v2;
}
?>