PHP Conference Fukuoka 2025

array_intersect_ukey

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_intersect_ukeyCalcula la intersección de dos arrays utilizando una función de retrollamada sobre las claves para la comparación

Descripción

array_intersect_ukey(array $array, array ...$arrays, callable $key_compare_func): array

array_intersect_ukey() devuelve un array que contiene todas las valores del array array que contienen claves presentes en todos los argumentos.

Parámetros

array

Array inicial para la comparación de arrays.

arrays

Arrays a comparar.

key_compare_func

La función de comparación debe retornar un entero menor que, igual a, o mayor que 0 si el primer argumento es considerado, respectivamente, menor que, igual a, o mayor que el segundo.

callback(mixed $a, mixed $b): int
Precaución

Retornar valores no-entero desde la función de comparación, tales como float, resultará en una conversión interna del valor de retorno del callback a int. Así, valores tales como 0.99 y 0.1 serán convertidos ambos a un valor entero de 0, lo que comparará tales valores como iguales.

Valores devueltos

Devuelve los valores del array array cuyas claves existen en todos los argumentos.

Ejemplos

Ejemplo #1 Ejemplo con array_intersect_ukey()

<?php
function key_compare_func($key1, $key2)
{
if (
$key1 == $key2)
return
0;
else if (
$key1 > $key2)
return
1;
else
return -
1;
}

$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);

var_dump(array_intersect_ukey($array1, $array2, 'key_compare_func'));
?>

El ejemplo anterior mostrará :

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

En este ejemplo, se puede ver que solo las claves 'blue' y 'green' están presentes en ambos arrays y, por lo tanto, son devueltas. Note también que los valores para las claves 'blue' y 'green' difieren entre los dos arrays. No obstante, aún coinciden porque solo las claves son verificadas. Los valores devueltos son los del array array.

Ver también

  • array_diff() - Calcula la diferencia entre arrays
  • array_udiff() - Calcula la diferencia entre dos arrays utilizando una función de retrollamada
  • array_diff_assoc() - Calcula la diferencia de dos arrays, teniendo en cuenta las claves
  • array_diff_uassoc() - Calcula la diferencia entre dos arrays asociativos, utilizando una función de retrollamada
  • array_udiff_assoc() - Calcula la diferencia entre arrays con verificación de índices, compara los datos con una función de retrollamada
  • array_udiff_uassoc() - Calcula la diferencia entre dos arrays asociativos, compara los datos y los índices con una función de retorno
  • array_diff_key() - Calcula la diferencia de dos arrays utilizando las claves para la comparación
  • array_diff_ukey() - Calcula la diferencia entre dos arrays utilizando una función de retrollamada sobre las claves para comparación
  • array_intersect() - Calcula la intersección de arrays
  • array_intersect_assoc() - Calcula la intersección de dos arrays con pruebas sobre los índices
  • array_intersect_uassoc() - Calcula la intersección de dos arrays con pruebas en los índices, compara los índices utilizando una función de retrollamada
  • array_intersect_key() - Calcula la intersección de dos arrays utilizando las claves para la comparación

add a note

User Contributed Notes 2 notes

up
0
gk at anuary dot com
12 years ago
"array_intersect_ukey" will not work if $key_compare_func is using regular expression to perform comparison. "_array_intersect_ukey" fully implements the "array_intersect_ukey" interface and handles properly boolean comparison. However, the native implementation should be preferred for efficiency reasons.<?php$key_compare_func = function ($a, $b) {    var_dump('a=' . $a. '; b=' . $b);        if (strpos($b, '/') === 0) {        return preg_match($b, $a) > 0 ? 0 : -1;    }        if ($a == $b) {        $weight = 0;    } else if ($a > $b) {        $weight = 1;    } else {        $weight = -1;    }        var_dump('literal comparison: ' . $weight);        return $weight;};$foo = ['aab' => '', 'bbb' => '', 'ccb' => '', 'abb' => ''];$bar = ['/[a-z]b[a-z]/' => ''];$buz = ['/c[a-z][a-z]/' => ''];echo PHP_EOL . 'array_intersect_ukey' . PHP_EOL . PHP_EOL;$subject = array_intersect_ukey ($foo, $bar, $buz, $key_compare_func);echo PHP_EOL;var_dump($subject);echo PHP_EOL . '_array_intersect_ukey' . PHP_EOL . PHP_EOL;$subject = _array_intersect_ukey($foo, $bar, $buz, $key_compare_func);echo PHP_EOL;var_dump($subject);/** * @author Gajus Kuizinas <gk@anuary.com> * @version 1.0.0 (2013 09 30) * @url https://gist.github.com/gajus/271ad5f36337a32a184c */function _array_intersect_ukey (array $arr1, array $arr2, $key_compare_func) {    $arr_matched = [];    $arr_unmatched = [];        $args = func_get_args();        $key_compare_func = end($args);        foreach ($arr1 as $k1 => $v1) {        foreach ($arr2 as $k2 => $v2) {            $diff = $key_compare_func($k1, $k2);                    //var_dump('k1=' . $k1 . ', k2=' . $k2 . ', diff=' . $diff);                        if ($diff === 0) {                $arr_matched[$k1] = $v1;            } else {                $arr_unmatched[$k1] = $v1;            }        }    }        if (count($args) <= 3) {        return $arr_matched;    }        array_splice($args, 0, 2, [$arr_unmatched]);        return array_merge($arr_matched, call_user_func_array('_array_intersect_ukey', $args));}/*array_intersect_ukeystring(12) "a=bbb; b=aab"string(21) "literal comparison: 1"string(12) "a=bbb; b=ccb"string(22) "literal comparison: -1"string(12) "a=abb; b=bbb"string(22) "literal comparison: -1"string(12) "a=aab; b=abb"string(22) "literal comparison: -1"string(22) "a=aab; b=/[a-z]b[a-z]/"string(22) "a=abb; b=/[a-z]b[a-z]/"string(22) "a=abb; b=/c[a-z][a-z]/"array(0) {}_array_intersect_ukeystring(22) "a=aab; b=/[a-z]b[a-z]/"string(22) "a=bbb; b=/[a-z]b[a-z]/"string(22) "a=ccb; b=/[a-z]b[a-z]/"string(22) "a=abb; b=/[a-z]b[a-z]/"string(22) "a=aab; b=/c[a-z][a-z]/"string(22) "a=ccb; b=/c[a-z][a-z]/"array(3) {  ["bbb"]=>  string(0) ""  ["abb"]=>  string(0) ""  ["ccb"]=>  string(0) ""}*/?>
up
-1
lincoln dot du dot j at gmail dot com
3 months ago
This is a cleaner and more modern approach (PHP 7.4+ syntax).<?php$array1 = ['blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4];$array2 = ['green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8];$result = array_intersect_ukey($array1, $array2, fn($a, $b) => $a <=> $b);var_dump($result);?>Explanation:The comparison function fn($a, $b) => $a <=> $b uses the spaceship operator directly inside the array_intersect_ukey call.The result will contain entries from $array1 whose keys also exist in $array2.Output:phpCopyEditarray(2) {  ["blue"]=>  int(1)  ["green"]=>  int(3)}
To Top