International PHP Conference Berlin 2025

array_intersect_ukey

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

array_intersect_ukeyCalcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

Description

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

array_intersect_ukey() retourne un tableau contenant toutes les valeurs du tableau array qui contiennent des clés présentes dans tous les arguments.

Liste de paramètres

array

Tableau initial pour la comparaison des tableaux.

arrays

Tableaux à comparer contre

key_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

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

Retourner des valeurs non-entières à partir de la fonction de comparaison, telles que float, entraînera une conversion interne de la valeur de retour du rappel en int. Ainsi, des valeurs telles que 0.99 et 0.1 seront toutes deux converties en une valeur entière de 0, ce qui comparera de telles valeurs comme égales.

Valeurs de retour

Retourne les valeurs du tableau array dont les clés existent dans tous les arguments.

Exemples

Exemple #1 Exemple avec 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'));
?>

L'exemple ci-dessus va afficher :

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

Dans cet exemple, vous pouvez voir que seules les clés 'bleu' et 'vert' sont présentes dans les deux tableaux et, donc, elles sont retournées. Notez également que les valeurs pour les clés 'bleu' et 'vert' diffèrent entre les deux tableaux. Néanmoins, elles correspondent toujours car uniquement les clés sont vérifiées. Les valeurs retournées sont celles du tableau array.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_diff_key() - Calcule la différence de deux tableaux en utilisant les clés pour comparaison
  • array_diff_ukey() - Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_intersect_key() - Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison

add a note

User Contributed Notes 1 note

up
0
gk at anuary dot com
11 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_ukey

string(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_ukey

string(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) ""
}*/
?>
To Top