20

我有一个包含国家/地区的数组:

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()检查每个键,但这似乎真的效率低下......

4

4 回答 4

45
$selection = array('AL', 'DZ');
$filtered = array_intersect_key($countries, array_flip($selection));
var_dump($filtered);
于 2012-07-25T07:16:57.543 回答
4

只需循环第二个数组,然后从第一个数组中获取值。反之亦然,似乎确实是不必要的低效。

所以:

$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() 测试。

于 2012-07-25T07:13:45.250 回答
-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));
于 2012-07-25T07:40:16.597 回答
-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);
于 2012-07-25T07:08:14.267 回答