array_intersect_key

(PHP 5 >= 5.1.0)

array_intersect_keyВычислить пересечение массивов, сравнивая ключи

Описание

array array_intersect_key ( array $array1 , array $array2 [, array $ ... ] )

array_intersect_key() возвращает массив, содержащий все элементы array1, имеющие ключи, содержащиеся во всех последующих параметрах..

Список параметров

array1

Основной проверяемый массив.

array2

Массив, с которым идет сравнение.

array

Переменный список сравниваемых массивов

Возвращаемые значения

Возвращает ассоциативный массив, содержащий все элементы array1, имеющие ключи, содержащиеся во всех остальных параметрах. arguments.

Примеры

Пример #1 Пример использования array_intersect_key()

<?php
$array1 
= array('blue'  => 1'red'  => 2'green'  => 3'purple' => 4);
$array2 = array('green' => 5'blue' => 6'yellow' => 7'cyan'   => 8);

var_dump(array_intersect_key($array1$array2));
?>

Результат выполнения данного примера:

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

В нашем примере только ключи 'blue' и 'green' содержатся в обоих массивах и поэтому возвращаются. Также обратите внимание, что значения, соответствующие ключам 'blue' и 'green' различны в исходных массивах. Совпадение все равно происходит, так как сравниваются только ключи. Возвращаемые значения берутся из array1.

Два ключа пар key => value считаются равными только, если (string) $key1 === (string) $key2 . Другими словами, применяется строгая проверка, означающая, что строковые представления должны быть одинаковыми.

Смотрите также

  • array_diff() - Вычислить расхождение массивов
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса, осуществляемой при помощи callback-функции
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_diff_key() - Вычисляет расхождение массивов, сравнивая ключи
  • array_diff_ukey() - Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
  • array_intersect() - Вычисляет схождение массивов
  • array_intersect_assoc() - Вычисляет схождение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет схождение массивов с дополнительной проверкой индекса, осуществляемой при помощи callback-функции
  • array_intersect_ukey() - Вычисляет схождение массивов, используя callback-функцию для сравнения ключей

Коментарии

This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat
2005-05-29 11:51:02
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Автор:
Jesse: no, array_intersect_key does not accomplish the same thing as what you posted:

array_flip (array_intersect (array_flip ($a), array_flip ($b)))

because when the array is flipped, values become keys. having duplicate values is not a problem, but having duplicate keys is. array_flip resolves it by keeping only one of the duplicates and discarding the rest. by the time you start intersecting, you've already lost information.
2006-03-31 02:49:50
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Автор:
Here it is a more obvious way to implement the function:

if (!function_exists('array_intersect_key')) {
    function array_intersect_key()
    {
        $arrs = func_get_args();
        $result = array_shift($arrs);
        foreach ($arrs as $array) {
            foreach ($result as $key => $v) {
                if (!array_key_exists($key, $array)) {
                    unset($result[$key]);
                }
            }
        }
        return $result;
   }
}
2006-07-17 08:31:26
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Автор:
Here is a faster version than those shown below, with optimisation for the case when only two arrays are passed. In my tests with a 10000 item first array and a 5000 item second array (run 20 times) this function ran in 1.89 seconds compared with 2.66 for the version posted by dak. For a three array case, same as above but with the third array containing 3333 values, the timing is 3.25 for this version compared with 3.7 for dak's version.

<?php
if (!function_exists('array_intersect_key'))
{
  function 
array_intersect_key($isec$keys)
  {
   
$argc func_num_args();
    if (
$argc 2)
    {
      for (
$i 1; !empty($isec) && $i $argc$i++)
      {
       
$arr func_get_arg($i);
        foreach (
array_keys($isec) as $key)
        {
          if (!isset(
$arr[$key]))
          {
            unset(
$isec[$key]);
          }
        }
      }
      return 
$isec;
    }
    else
    {
     
$res = array();
      foreach (
array_keys($isec) as $key)
      {
        if (isset(
$keys[$key]))
        {
         
$res[$key] = $isec[$key];
        }
      }
      return 
$res;
    }
  }
}
?>
2007-05-06 00:10:42
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
I have found the following helpful:
<?PHP
function array_merge_default($default$data) {
       
$intersect array_intersect_key($data$default); //Get data for which a default exists
       
$diff array_diff_key($default$data); //Get defaults which are not present in data
       
return $diff $intersect//Arrays have different keys, return the union of the two
}
?>
It's use is like both of the functions it uses, but keeps defaults and _only_ defaults. It's designed for key arrays, and i'm not sure how it will work on numeric indexed arrays.

Example:
<?PHP
$default 
= array(
 
"one" => 1,
 
"two" => 2
);
$untrusted = array(
 
"one" => 42,
 
"three" => 3
);
var_dump(array_merge_default($default$untrusted));

array(
2) {
  [
"two"]=>
 
int(2)
  [
"one"]=>
 
int(42)
}

?>
2008-01-04 16:04:30
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Just a simple script if you want to use one array, which contains only zeros and ones, as mask for another one (both arrays must have the same size of course). $outcome is an array that contains only those values from $source where $mask is equal to 1.

<?php
$outcome 
array_values(array_intersect_keyarray_values($source), array_filter(array_values($mask)) ));
?>

PS: the array_values() function is necessary to ensure that both arrays have the same numbering/keys, otherwise your masking does not behave as you expect.

Enjoy!
2009-02-23 09:52:26
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
<?php
   
/**
     * calculates intersection of two arrays like array_intersect_key but recursive
     *
     * @param  array/mixed  master array
     * @param  array        array that has the keys which should be kept in the master array
     * @return array/mixed  cleand master array
     */
   
function myIntersect($master$mask) {
        if (!
is_array($master)) { return $master; }
        foreach (
$master as $k=>$v) {
            if (!isset(
$mask[$k])) { unset ($master[$k]); continue; } // remove value from $master if the key is not present in $mask
           
if (is_array($mask[$k])) { $master[$k] = $this->myIntersect($master[$k], $mask[$k]); } // recurse when mask is an array
            // else simply keep value
       
}
        return 
$master;
    }
?>
2009-09-24 07:43:56
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Regarding php at keithtylerdotcom solution to emulate

<?php
$z 
someFuncReturningAnArray()['some_key'];
?>

His recommended solution will still return an array. To get the value of a single key in an array returned by a function, simply add implode() to the recipe:

<?php
function someFuncReturningAnArray() {
  return array(
   
'a' => 'b',
   
'c' => 'd',
   
'e' => 'f',
   
'g' => 'h',
   
'i' => 'j'
 
);
}

//traditional way
$temp someFuncReturningAnArray();
$b $temp['a'];
echo 
print_r($b1) . "\n----------\n";

//keithtylerdotcom one-line method
$b array_intersect_key(someFuncReturningAnArray(), array('a'=>''));
echo 
print_r($b1) . "\n----------\n";

//better one line method
$b implode(''array_intersect_key(someFuncReturningAnArray(), array('a'=>'')));
echo 
print_r($b1) . "\n----------\n";
?>
2009-11-11 12:23:06
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Note that the order of the keys in the returned array is the same as the order of the keys in the source array. eg:

<?php
$array 
= array(
   
'two'   => 'a',
   
'three' => 'b',
   
'one'   => 'c',
    );

$keyswant = array(
   
'one'       => '',
   
'three'     => '',
    );

print_r(array_intersect_key($array$keyswant));

?>

Shows:

Array
(
    [three] => b
    [one] => c
)
2011-07-18 11:01:11
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Simple key white-list filter:

<?php
$arr 
= array('a' => 123'b' => 213'c' => 321);
$allowed = array('b''c');

print_r(array_intersect_key($arrarray_flip($allowed)));
?>

Will return:
Array
(
    [b] => 213
    [c] => 321
)
2012-08-13 11:03:59
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
in case you came here looking for a function that returns an array containing the values of `all` arrays with intersecting keys:
<?php
   
function array_merge_on_key($key$array1$array2) {
     
$arrays array_slice(func_get_args(), 1);
     
$r = array();
      foreach(
$arrays as &$a) {
         if(
array_key_exists($key$a)) {
           
$r[] = $a[$key];
            continue;
         }
      }
      return 
$r;
   }
   
// example:
   
$array1 = array("id" => 12"name" => "Karl");
   
$array2 = array("id" => 4"name" => "Franz");
   
$array3 = array("id" => 9"name" => "Helmut");
   
$array4 = array("id" => 10"name" => "Kurt");

   
$result array_merge_on_key("id"$array1$array2$array3$array4);

   echo 
implode(","$result); // => 12,4,9,10
?>
2013-09-28 11:08:48
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Автор:
[Editor's note: changed array_merge_recursive() to array_replace_recursive() to fix the script]

Here is a better way to merge settings using some defaults as a whitelist.

<?php

$defaults 
= [
   
'id'            => 123456,
   
'client_id'     => null,
   
'client_secret' => null,
   
'options'       => [
       
'trusted' => false,
       
'active'  => false
   
]
];

$options = [
   
'client_id'       => 789,
   
'client_secret'   => '5ebe2294ecd0e0f08eab7690d2a6ee69',
   
'client_password' => '5f4dcc3b5aa765d61d8327deb882cf99'// ignored
   
'client_name'     => 'IGNORED',                          // ignored
   
'options'         => [
       
'active' => true
   
]
];

var_dump(
   
array_replace_recursive($defaults
       
array_intersect_key(
           
$options$defaults
       
)
    )
);

?>

Output:

array (size=4)
    'id'            => int 123456
    'client_id'     => int 789
    'client_secret' => string '5ebe2294ecd0e0f08eab7690d2a6ee69' (length=32)
    'options'       => 
        array (size=2)
            'trusted' => boolean false
            'active'  => boolean true
2014-05-12 08:47:46
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html
Автор:
If you want an array that has no key value pairs added from the second array:

$new = array_intersect_key($b, $a) + $a;
2015-03-03 01:38:44
http://php5.kiev.ua/manual/ru/function.array-intersect-key.html

    Поддержать сайт на родительском проекте КГБ