2012-07-25 78 views
16

我有了国家的数组:数组相交在数组中的键?

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

和我有了一些键在它

array('AL', 'DZ'); 

我要打电话,将采取两个数组作为参数的函数另一个数组并返回

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

我知道PHP内置函数比较键或值,但似乎这些功能都指望你哈有两个1D阵列或两个2D阵列。

我可以遍历array_keys()的第一阵列和做每个键in_array()检查,但似乎真的inefficent ...

回答

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

我不得不看两次,但这是一个非常好的简短解决方案。 +1 – 2012-07-25 07:35:03

+0

@deceze - 好的解决方案 - 是否有一种有效的方法来计算新数组中的所有值是否匹配(例如,在这里检查:$ selection = array('AL','AF','DZ',' AS'); – JM4 2013-07-16 16:48:30

+2

@ JM4是的,做一个'diff'而不是'intersect'。 – deceze 2013-07-16 16:56:33

-2

如果我理解正确的话你有国家的数组,需要国家的阵列和你想要与所需的国家创建数组。如果是这样,那么你可以试试这个:

$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

这是不正确的答案。 请阅读http://php.net/manual/en/function.in-array.php – 2014-08-06 03:54:35

4

简单地遍历SECOND数组,并从第一个数组中取值。虎钳似乎并不需要低效。

所以:

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

我不认为这是低效的。

编辑添加:如果您100%确定$ Arr2只包含可以在$ Arr1中找到的代码,那么您当然可以跳过isset()测试。

+2

+1的in_array函数以提高效率,但我更喜欢我的交集方法,因为它更加简洁并且可能足够高效。 .. :) – deceze 2012-07-25 07:20:39

+0

@deceze:我个人需要更多的时间来理解你的方法。虽然它更短(代码行),但我必须三思而后行。例如,它如何处理缺失条目。经过两次思考,我发现它处理它们就好了。 ;-)尼斯解决方案! – 2012-07-25 07:34:27

-1

我认为这会有所帮助。这是一个函数key_values_intersect,它可以像你期望的那样工作:)

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