2012-07-25 7 views
16

Ho un array con i paesi:L'array si interseca sulla chiave nell'array?

array(
'AF'=>'AFGHANISTAN', 
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
'AS'=>'AMERICAN SAMOA', 
); 

e ho un altro array che ha alcuni dei tasti in esso

array('AL', 'DZ'); 

voglio chiamare una funzione che avrà entrambi gli array come parametri e torno

array(
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
); 

so php è costruito nelle funzioni per confrontare le chiavi o valori, ma sembra tutto quelle funzioni si aspettano di ettari ve due array 1D o due array 2D.

potevo ciclo su array_keys() per il primo array e fare un controllo in_array() su ogni tasto, ma che sembra davvero inefficent ...

risposta

39
$selection = array('AL', 'DZ'); 
$filtered = array_intersect_key($countries, array_flip($selection)); 
var_dump($filtered); 
+0

Ho dovuto guardare due volte, ma è una soluzione molto bella, breve. +1 –

+0

@deceze - buona soluzione - esiste un modo efficace per calcolare se TUTTI i valori nel nuovo array corrispondono (ad esempio, un controllo: $ selection = array ('AL', 'AF', 'DZ', ' AS '); – JM4

+2

@ JM4 Sì, esegui un 'diff' invece di un' intersect'. – deceze

-2

Se ho capito bene Hai serie di paesi e la matrice dei paesi necessari e Lei voglio creare array con i paesi necessari. In questo caso, puoi provare questo:

$countries = array ("AF"=>"AFGJANISTAN", "AL"=>"ALBANIA", "LV"=>"LATVIA", "USA"=>"UNITED STATES OF AMERICA"); 
$needed = array ("AF", "AL"); 

$result = array(); 
foreach ($needed as $row) { 
    if (in_array($row, $contries)) { 
     $result[] = $countries[$row]; 
    } 
} 
var_dump($result); 
+0

Questa è una risposta errata. Per favore, leggi come funziona la funzione 'in_array' su http://php.net/manual/en/function.in-array.php –

4

Basta eseguire il ciclo sull'array SECOND e recuperare i valori dal primo. Il vicolo cieco sembra inefficace.

Quindi:

$Arr1 = array(
'AF'=>'AFGHANISTAN', 
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
'AS'=>'AMERICAN SAMOA', 
); 

$Arr2 = array('AL', 'DZ'); 

$result = array(); 
foreach ($Arr2 as $cc){ 
    if (isset($Arr1[$cc])){ 
    $result[$cc] = $Arr1[$cc]; 
    } 
} 
print_r($result); 

non credo che sia inefficiente.

Modifica aggiunta: Se sei sicuro al 100% che $ Arr2 contenga solo codici che possono essere trovati in $ Arr1, puoi ovviamente saltare il test isset().

+2

+1 per efficienza, anche se preferisco il mio approccio incrociato come più conciso e probabilmente abbastanza efficiente. .. :) – deceze

+0

@deceze: Personalmente ho bisogno di più tempo per capire il tuo approccio. Mentre è più breve (linee di codice) devo pensarci due volte. Ad esempio, come gestisce le voci mancanti. Dopo aver pensato due volte, vedo che li gestisce proprio bene. ;-) Bella soluzione! –

-1

Penso che questo aiuterà. Ecco una funzione key_values_intersect che funzionerà come previsto :)

$longcodes = array(
    'AF' => 'AFGHANISTAN', 
    'AL' => 'ALBANIA', 
    'DZ' => 'ALGERIA', 
    'AS' => 'AMERICAN SAMOA', 
); 

$code = array('AL', 'DZ'); 

function key_values_intersect($haystack, $needle) 
{ 
    $tmp=array(); 
    foreach ($needle AS $key) { 
     $tmp[$key] = $haystack[$key]; 
    } 
    return $tmp; 
} 


print_r(key_values_intersect($longcodes,$code)); 
Problemi correlati