CascadiaPHP 2024

array_uintersect

(PHP 5, PHP 7, PHP 8)

array_uintersectComputes the intersection of arrays, compares data by a callback function

Descrizione

array_uintersect(array $array, array ...$arrays, callable $value_compare_func): array

Computes the intersection of arrays, compares data by a callback function.

Elenco dei parametri

array

The first array.

arrays

Arrays to compare against.

value_compare_func

La funzione di confronto deve restituire un intero minore, uguale o maggiore di zero se il primo argomento è considerato essere minore, uguale o maggiore del secondo.

callback(mixed $a, mixed $b): int
Attenzione

Returning non-integer values from the comparison function, such as float, will result in an internal cast to int of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.

Attenzione

The sorting callback must handle any value from any array in any order, regardless of the order they were originally provided. This is because each individual array is first sorted before being compared against other arrays. For example:

<?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;
};
?>

Valori restituiti

Returns an array containing all the values of array that are present in all the arguments.

Esempi

Example #1 array_uintersect() example

<?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"));
?>

Il precedente esempio visualizzerà:

Array
(
    [a] => green
    [b] => brown
    [0] => red
)

Vedere anche:

add a note

User Contributed Notes 4 notes

up
17
Nate at RuggFamily dot com
17 years ago
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"));
?>
up
5
Ryan C
2 years ago
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;
}
?>
up
3
rob dot c dot ruiz at gmail dot com
5 years ago
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');
up
3
Hayley Watson
6 years ago
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.
To Top