2009-11-16 5 views
6

Peut-être que je deviens fou, mais je l'aurais juré qu'il y avait une fonction de base de PHP qui a pris deux tableaux comme arguments:assez simple question d'intersection de tableau PHP

$a = array('1', '3'); 
$b = array('1'=>'apples', '2'=>'oranges', '3'=>'kiwis'); 

et effectue une intersection où les valeurs de tableau $a sont vérifiés pour les collisions avec les clés dans le tableau $b. De retour quelque chose comme

array('1'=>'apples', '3'=>'kiwis'); 

Est-ce que cette fonction existe (ce qui me manquait dans la documentation), ou est-il un moyen très optimisé pour obtenir la même chose?

Répondre

10

essayer d'utiliser array_flip {commutateurs clés avec leurs valeurs} puis utilisez array_intersect() sur votre exemple:

$c = array_flip($b); // so you have your original b-array 
$intersect = array_intersect($a,c); 
+1

Cela fonctionnerait pour l'exemple donné, mais ne permet pas de valeurs en double dans $ b. Je ferais la variation de flipping $ a (car il est supposé contenir des clés de toute façon) et faire 'array_intersect_key ($ b, array_flip ($ a))'. –

+0

bon point sur les doublons, n'a pas pensé à celui-là – Raz

+6

'array_intersect_key ($ b, array_flip ($ a))' s'avère être le travail. À votre santé! –

2

Je ne suis pas 100% clair ce que vous voulez. Voulez-vous vérifier les valeurs de $ a contre KEYS à partir de $ b?

Il y a quelques fonctions entrecoupent:

http://php.net/manual/en/function.array-intersect.php http://www.php.net/manual/en/function.array-intersect-key.php

Mais peut-être vous avez besoin:

http://www.php.net/manual/en/function.array-intersect-ukey.php de sorte que vous pouvez définir votre propre fonction pour faire correspondre les touches et/ou des valeurs.

1

faire un simple foreach pour itérer le premier réseau et obtenir les valeurs correspondantes du deuxième tableau:

$output = array(); 
foreach ($a as $key) { 
    if (array_key_exists($key, $b)) { 
     $output[$key] = $b[$key]; 
    } 
} 
0

Juste une variation de la réponse Gumbo, devrait être plus efficace que les tests sur les touches sont effectuées juste avant d'entrer dans la boucle.

$intersection = array_intersect($a, array_keys($b)); 
$result=array(); 
foreach ($intersection as $key) { 
    $result[$k]=$b[$k]; 
}