(PHP 5, PHP 7, PHP 8)
array_uintersect — Calcula la intersección de dos arrays, compara los datos utilizando una función de retrollamada
Calcula la intersección de dos arrays, compara los datos utilizando una función de retrollamada.
arrayEl primer array.
arraysArrays a comparar contra
value_compare_func
Devolver valores no enteros (como
float ) desde la función de comparación resultará en una conversión interna del valor de retorno de la retrollamada a
int . Así, valores como
0.99 y 0.1 serán convertidos ambos al
valor entero 0, por lo que se compararán como iguales.
La función de callback de ordenación debe tratar cualquier valor de cualquier array en cualquier orden, independientemente del orden en el que fueron proporcionados inicialmente. Esto se debe a que cada array individual es ordenado primero antes de ser comparado con otros arrays. Por ejemplo:
<?php
$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 y $item2 pueden ser cualquiera de los siguientes valores : "cadena", 1 o
["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;
};
?>
Retorna un array conteniendo todos los valores del array
array que están presentes en todos
los argumentos.
Ejemplo #1 Ejemplo con 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"));
?>El ejemplo anterior mostrará:
Array ( [a] => green [b] => brown [0] => red )
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"));
?>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;
}
?>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');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.