PHP scan : array intersect
À 00:34 dans la rubrique PHP / PEAR
←
/ #998
/ rss
/ →
Il y bien bien longtemps (8-9 ans), j'écrivais un tuto sur les tableaux en php(3)... que d'eau passées sous les ponts depuis, avec surtout la révolutionnaire arrivée des itérateurs.
Pourquoi je parle de ceci ?
Une question au boulot hier : j'ai une liste et un tableau. Je veux récuperer les valeurs du tableau en question pour lesquelles les clés sont dans la liste.
Et ce sans faire de boucle en php.
Première réponse qui me vient à l'esprit : filterIterator ou array_ intersect_???
Ca c'était pour la petite histoire et pour un post ulterieur, mais là je vais d'abord passer en revue la famille des array_intersect_*
Fonction | PHP 4 | PHP 5 - - - - - - - - - - - - - | - - - - - | - - - - - array_intersect | >= 4.0.1 | oui array_intersect_assoc | >= 4.3.0 | oui array_intersect_key | non | >= 5.1.0 array_intersect_uassoc | | oui array_intersect_ukey | non | >= 5.1.0 array_uintersect_assoc | non | oui array_uintersect_uassoc | non | oui
Points communs
- retournent toutes un tableau
- les valeurs retournées sont toujours celle du premier tableau
- les clés retournées sont toujours celle du premier tableau
- le nombre de tableau supplémentaires est libre
- pour les _intersect_u le nom de la fonction call back est à la fin.
- pour les _uintersect_u le nom des 2 fonctions callback est à la fin.
- toutes disponibles à partir de 5.1.0 (et vous n'utilisez pas une antiquité donc vous les avez toutes

array_intersect
- array_intersect ( array $array1 , array $array2 [, array $ ... ] )
retourne un tableau contenant toutes les valeurs qui sont présentes dans tous les autres arguments array2 , ...
array_intersect_assoc
- array_intersect_assoc ( array $array1 , array $array2 [, array $ ... ] )
retourne un tableau contenant toutes les valeurs qui sont aussi présentes dans tous les autres arguments array2 , ... Notez que les clés sont utilisées durant la comparaison, contrairement à array_intersect().
array_intersect_key
- array_intersect_key ( array $array1 , array $array2 [, array $ ... ] )
array_intersect_key() retourne un tableau contenant toutes les valeurs du tableau array1 qui contiennent des clés présentes dans tous les arguments.
array_intersect_uassoc
- array_intersect_uassoc ( array $array1 , array $array2 [, array $ ... ] , callback $key_compare_func )
retourne un tableau contenant toutes les valeurs du tableau array1 qui sont présentes dans tous les arguments. Notez que les clés sont utilisées dans la comparaison par opposition à la fonction array_intersect().
La comparaison d'index est effectuée en utilisant la fonction de rappel fournie. Elle doit retourner un entier, plus petit que, égal à ou plus grand que zéro si le premier argument est considéré comme étant, respectivement, plus petit que, égal à ou plus grand le second.
array array_intersect_ukey
- array_intersect_ukey ( array $array1 , array $array2 [, array $ ... ] , callback $key_compare_func )
retourne un tableau contenant toutes les valeurs du tableau array1 qui contiennent des clés présentes dans tous les arguments array2 , ... Cette comparaison est effectuée en utilisant une fonction de rappel fournie par l'utilisateur. La fonction de rappel doit retourner un entier plus petit que, égal à ou plus grand que 0 si la première clé est considérée, respectivement, comme plus petite que, égale à ou plus grande que la seconde.
exemples
<?php
highlight_file(__FILE__);
echo '<hr/><pre>';
$array1 = array("a" => "green", "x"=>"red", "blue", "yellow", "v"=>"brown", "t"=>"purple", "orange");
$array2 = array("b" => "green", "c"=>"yellow", "red", "X"=>"BLUE", "z"=>"a", "gray","v"=>"brown", "T"=>"purple");
print_r($array1);
print_r($array2);
echo '-----' . "\n";
echo 'array_intersect' . "\n";
print_r(array_intersect($array1, $array2));
// quelles valeurs (et leurs clé dans array1) sont dans les 2 tableaux ?
echo '-----' . "\n";
echo 'array_intersect_assoc' . "\n";
print_r(array_intersect_assoc($array1, $array2));
// quels couples clé-valeurs sont dans les 2 tableaux ?
echo '-----' . "\n";
echo 'array_intersect_key' . "\n";
print_r(array_intersect_key($array1, $array2));
// quelles clés (et leurs valeurs dans array1)
// notez que bleu qui avait automatiquement reçu la clé 0
// et yellow la clé 1 sont repris car red avait cette clé 0 et gray la 1 dans array2,
// par contre orange n'est pas repris
echo '-----' . "\n";
echo 'array_uintersect' . "\n";
$array2['T']='purple';
print_r(array_uintersect($array1, $array2, "strcasecmp"));
// ici on va donc comparer les valeurs de array 1 et 2
// si strcasecmp retourne vrai on reprend la valeur et sa clé dans array 1
echo '-----' . "\n";
echo 'array_intersect_uassoc' . "\n";
print_r(array_intersect_uassoc($array1, $array2, "strcasecmp"));
// C'est comme array_intersect_assoc
// mais on donne la fonction qui décide si les clés et les valeurs sont "les mêmes"
// ici strcasecmp rends la comparaison insensible à la casse, du coup t = T et purple s'ajoute au brown
echo '-----' . "\n";
echo 'array_intersect_ukey' . "\n";
$array2['T']='gold';
print_r(array_intersect_ukey($array1, $array2, 'strcasecmp'));
echo ' - - - - -' . "\n";
$array1['T']='black';
print_r(array_intersect_ukey($array1, $array2, 'strcasecmp'));
echo ' - - - - -' . "\n";
print_r(array_intersect_ukey($array1, $array2, 'key_compare_func'));
// C'est comme array_intersect_key
// on ne regarde que les clés mais on donne la fonction qui traite la comparaison
// ici strcasecmp rends la comparaison insensible à la casse,
// du cup t =T et purple s'ajoute au brown alors que la valeur associée au t avait été changée.
// Notez que si on ajoute à array1 une valeur pour T (alors que t existe toujours, c'est purple qui sera retourné et non black
// pour le troisieme exemple on prend une fonction maison qui compare
echo '-----' . "\n";
$array1['t']='PuRple';
$array2['T']='purple';
$array1['x']='silver';
$array2['x']='SilVer';
$array1['y']='yyyy';
$array2['Y']='YYYY';
$array1['G']='G';
$array2['g']='g';
$array1['h']='h';
$array2['h']='h';
$array1['J']='J';
$array2['J']='J';
echo 'array_uintersect_assoc' . "\n";
// La doc n'est pas claire car les 2 fonctions on la même description
print_r(array_uintersect_assoc($array1, $array2, "strcasecmp")); //Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
print_r(array_intersect_uassoc($array1, $array2, "strcasecmp")); //Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
// et pourtant les résultats differrent.puis que la première accepte x=>silver
// je ne suis pas sur de moi mais je dirait que pour la première strcasecmp s'applique au clé et au valeurs contrairement à ce que dit la doc.
echo '-----' . "\n";
echo 'array_uintersect_uassoc' . "\n";
print_r(array_uintersect_uassoc($array1, $array2, "strcasecmp", "strcasecmp"));
// Dans ce cas on peut choisir une fonction utilisateur pour les clés et une pour les valeurs
function key_compare_func($key1, $key2)
{
if ($key1 == $key2)
return 0;
else if ($key1 > $key2)
return 1;
else
return -1;
}
?>
Array
(
[a] => green
[x] => red
[0] => blue
[1] => yellow
[v] => brown
[t] => purple
[2] => orange
)
Array
(
[b] => green
[c] => yellow
[0] => red
[X] => BLUE
[z] => a
[1] => gray
[v] => brown
[T] => purple
)
-----
array_intersect
Array
(
[a] => green
[x] => red
[1] => yellow
[v] => brown
[t] => purple
)
-----
array_intersect_assoc
Array
(
[v] => brown
)
-----
array_intersect_key
Array
(
[0] => blue
[1] => yellow
[v] => brown
)
-----
array_uintersect
Array
(
[a] => green
[x] => red
[0] => blue
[1] => yellow
[v] => brown
[t] => purple
)
-----
array_intersect_uassoc
Array
(
[v] => brown
[t] => purple
)
-----
array_intersect_ukey
Array
(
[x] => red
[0] => blue
[1] => yellow
[v] => brown
[t] => purple
)
- - - - -
Array
(
[x] => red
[0] => blue
[1] => yellow
[v] => brown
[t] => purple
)
- - - - -
Array
(
[a] => green
[0] => blue
[1] => yellow
[v] => brown
)
-----
array_uintersect_assoc
Array
(
[x] => silver
[v] => brown
[h] => h
[J] => J
)
Array
(
[v] => brown
[h] => h
[J] => J
)
-----
array_uintersect_uassoc
Array
(
[v] => brown
[t] => PuRple
[y] => yyyy
[G] => G
[h] => h
[J] => J
)
Je m'arrète là je continuerais à propos des itérateurs dans un autre posts. Et pour ces fonctions je vais donc creuser pour cette array_uintersect_assoc() que je n'ai pas correctement cerné.








Commentaires
1. Le mercredi 5 août 2009 à 00:49, par Moosh
Ajouter un commentaire