Hailwood
Hailwood

Reputation: 92601

Get intersections between the keys of an associative array and the values of an indexed array

I have an array that has countries:

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

and I have another array that has some of the keys in it

array('AL', 'DZ');

I want to call a function that will take both arrays as parameters and return

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

I know php has built in functions to compare the keys, or the values, but it seems those functions all expect you to have two 1D arrays or two 2D arrays.

I could loop over array_keys() for the first array and do a in_array() check on each key, but that seems really inefficient.

Upvotes: 21

Views: 10183

Answers (4)

Sanjeevshrestha
Sanjeevshrestha

Reputation: 49

I think this will help. Here is a function key_values_intersect that will work as you expected :)

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

Upvotes: -1

deceze
deceze

Reputation: 522210

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

Upvotes: 49

Erwin Moller
Erwin Moller

Reputation: 2408

Simply loop over the SECOND array, and fetch the values from the first. Vise versa seems unneeded inefficient indeed.

So:

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

I don't think that is inefficient.

Edit addition: If you are 100% sure the $Arr2 contains only codes that can be found in $Arr1, you can of course skip the isset() test.

Upvotes: 4

dpitkevics
dpitkevics

Reputation: 1258

If I understood correctly You have array of countries and array of needed countries and You want to create array with needed countries. If that, then You can try this:

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

Upvotes: -2

Related Questions