2012-07-25 10 views
16

Mam tablicę, która ma państwa:Array przecinają się na klucz w tablicy?

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

i mam inną tablicę, która ma jedne z kluczy w nim

array('AL', 'DZ'); 

chcę wywołać funkcję, która będzie miała obie tablice jako parametry i powrócić

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

znam php ma wbudowane funkcje do porównania klucze lub wartości, ale wydaje się wszystkie te funkcje można oczekiwać ha ve dwie tablice 1D lub dwie tablice 2D.

mogłem pętli nad array_keys() dla pierwszej tablicy i zrobić in_array() kontrolę na każdym kluczu, ale wydaje się, że naprawdę inefficent ...

Odpowiedz

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

Musiałem spojrzeć dwa razy, ale jest to bardzo ładne, krótkie rozwiązanie. +1 –

+0

@deceze - dobre rozwiązanie - czy istnieje skuteczny sposób obliczenia, czy WSZYSTKIE wartości w nowej tablicy pasują (na przykład tutaj, sprawdź: $ selection = array ('AL', 'AF', 'DZ', ' AS '); – JM4

+2

@ JM4 Tak, zrób 'diff' zamiast' przecięcia'. – deceze

-2

Jeśli dobrze zrozumiałem masz tablicę krajów i szereg potrzebnych krajach i Ty chcesz utworzyć tablicę z potrzebnymi krajami. Jeśli tak, to możesz spróbować:

$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

To jest niepoprawna odpowiedź. Przeczytaj, jak działa funkcja 'in_array' pod adresem http://php.net/manual/en/function.in-array.php –

4

Po prostu zapętlić drugą tablicę i pobrać wartości z pierwszego. Vise versa wydaje się niepotrzebna, nieefektywna.

Więc:

$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); 

Nie sądzę, że jest nieefektywne.

Edytuj dodatek: Jeśli masz 100% pewność, że $ Arr2 zawiera tylko kody, które można znaleźć w $ Arr1, możesz oczywiście pominąć test isset().

+2

+1 w celu zwiększenia wydajności, jednak preferuję podejście oparte na skrzyżowaniach jako bardziej zwięzłe i prawdopodobnie wystarczająco skuteczne. .. :) – deceze

+0

@deceze: Osobiście potrzebuję więcej czasu, aby zrozumieć twoje podejście. Chociaż jest krótszy (linie kodu), muszę dwa razy się nad tym zastanowić. Jak na przykład obsługuje brakujące wpisy. Po dwukrotnym zastanowieniu widzę, że radzi sobie z nimi w porządku. ;-) Ładne rozwiązanie! –

-1

Myślę, że to pomoże. Oto funkcja key_values_intersect, która zadziała zgodnie z oczekiwaniami :)

$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)); 
Powiązane problemy