获取关联数组的键和索引数组的值之间的交集

问题描述 投票:0回答:4

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

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

我还有另一个数组,里面有一些键

array('AL', 'DZ');

我想调用一个函数,它将两个数组作为参数并返回

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

我知道 php 有内置函数来比较键或值,但似乎这些函数都希望你有两个一维数组或两个二维数组。

我可以循环遍历第一个数组的

array_keys()
并对每个键进行
in_array()
检查,但这似乎效率很低。

php arrays key intersection
4个回答
49
投票
$selection = array('AL', 'DZ');
$filtered = array_intersect_key($countries, array_flip($selection));
var_dump($filtered);

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


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

-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);
© www.soinside.com 2019 - 2024. All rights reserved.