2009-11-16 16 views
6

Forse sto diventando pazzo, ma avrei giurato che ci fosse una funzione core di PHP che ha avuto due array come argomenti:Un po 'semplice domanda array PHP intersezione

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

ed esegue un incrocio dove i valori da l'array $a viene verificato per le collisioni con le chiavi nell'array $b. Tornando qualcosa come

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

Fa una tale funzione esiste (che ho perso nella documentazione), oppure c'è un modo molto ottimizzato per ottenere la stessa cosa?

risposta

10

provare a utilizzare array_flip {switch chiavi con i loro valori} e quindi utilizzare array_intersect() sul tuo esempio:

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

Questo funzionerebbe per l'esempio dato, ma non consente valori duplicati in $ b. Farei la variazione di lanciare $ a (come si suppone debba contenere le chiavi comunque) e fare 'array_intersect_key ($ b, array_flip ($ a))'. –

+0

buon punto sui duplicati, non ho pensato a quello – Raz

+6

'array_intersect_key ($ b, array_flip ($ a))' risulta per fare il lavoro. Saluti! –

1

fare una semplice foreach per iterare il primo array e ottenere i valori corrispondenti della seconda matrice:

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

Solo una variazione della risposta Gumbo, dovrebbe essere più efficiente vengono eseguiti i test sui tasti appena prima di entrare nel ciclo.

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