2012-07-25 27 views
16

tengo una matriz que tiene países:¿La matriz se intersecta en la tecla de la matriz?

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

y tengo otra matriz que tiene algunas de las claves en ella

array('AL', 'DZ'); 

Quiero llamar a una función que se llevará a ambas matrices como parámetros y vuelvo

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

sé PHP tiene funciones para comparar las llaves o los valores, pero parece que todas esas funciones esperan que usted ha Ve dos matrices 1D o dos matrices en 2D.

pude bucle sobre array_keys() por primera matriz y hacer una verificación de in_array() en cada tecla, pero que parece realmente inefficent ...

Respuesta

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

Tuve que mirar dos veces, pero es una solución muy buena y corta. +1 –

+0

@deceze - buena solución - ¿hay una forma eficiente de calcular si TODOS los valores en la nueva matriz coinciden (por ejemplo aquí, una comprobación: $ selection = array ('AL', 'AF', 'DZ', ' AS '); – JM4

+2

@ JM4 Sí, haz un 'diff' en lugar de un' intersects'. – deceze

-2

Si he entendido bien Tienes variedad de países y variedad de países necesarios y Usted quiero crear una matriz con los países necesarios. Si eso, entonces puede intentar esto:

$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

Esta es una respuesta incorrecta. Por favor, lea cómo la función 'in_array' funciona en http://php.net/manual/en/function.in-array.php –

4

Simplemente recorra la SEGUNDA matriz y obtenga los valores de la primera. Vise versa parece innecesario ineficaz de hecho.

Así:

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

no creo que es ineficiente.

Editar adición: Si está 100% seguro de que $ Arr2 contiene solo códigos que se pueden encontrar en $ Arr1, puede omitir la prueba isset().

+2

+1 por eficiencia, aunque prefiero que mi enfoque de intersección sea más conciso y probablemente lo suficientemente eficiente. .. :) – deceze

+0

@deceze: Personalmente necesito más tiempo para entender su enfoque. Si bien es más corto (líneas de código), debo pensarlo dos veces. Cómo maneja las entradas faltantes, por ejemplo. Después de pensar dos veces, veo que las maneja simplemente bien. ;-) Buena solución! –

-1

Creo que esto ayudará. Aquí hay una función key_values_intersect que funcionará como esperaba :)

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