数组 函数
在线手册:中文  英文

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

The array with master keys to check.

array2

An array to compare keys against.

array

A variable list of arrays to compare.

返回值

Returns an associative array containing all the entries of array1 which have keys that are present in all arguments.

范例

Example #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 时被认为相等。换句话说,执行的是严格类型检查,因此字符串的表达必须完全一样。

参见


数组 函数
在线手册:中文  英文

用户评论:

vladas dot dirzys at gmail dot com (2012-08-13 08:03:59)

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
)

pgl at yoyo dot org (2011-07-18 08:01:11)

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
)

chrisbloom7 at gmail dot com (2009-11-11 10:23:06)

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";
?>

markus dot kappe at dix dot at (2009-09-24 04:43:56)

<?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;
    }
?>

pdemaziere at gmail dot com (2009-02-23 07:52:26)

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!

CBWhiz at gmail dot com (2008-01-04 14:04:30)

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

?>

Rod Byrnes (2007-05-05 21:10:42)

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;
    }
  }
}
?>

(2006-07-17 05:31:26)

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

Anton Backer (2006-03-30 23:49:50)

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.

dak (2006-01-23 20:31:45)

A more efficient (and, I think, simpler) compatibility implementation:

<?php
if (!function_exists('array_intersect_key'))
{
    function 
array_intersect_key ($isec$arr2)
    {
        
$argc func_num_args();
         
        for (
$i 1; !empty($isec) && $i $argc$i++)
        {
             
$arr func_get_arg($i);
             
             foreach (
$isec as $k =>& $v)
                 if (!isset(
$arr[$k]))
                     unset(
$isec[$k]);
        }
        
        return 
$isec;
    }
}
?>

Silvio Ginter (2005-09-23 05:17:28)

Based on the code posted by gaylord dot aulke at 100days.de
i wrote this one. This should implement this function in all versions equal or greater than PHP 4.0
function array_intersect_key($arr1, $arr2) {
$res = array();
foreach($arr1 as $key=>$value) {
$push = true;
for ($i = 1; $i < func_num_args(); $i++) {
$actArray = func_get_arg($i);
if (gettype($actArray) != 'array') return false;
if (!array_key_exists($key, $actArray)) $push = false;
}
if ($push) $res[$key] = $arr1[$key];
}
return $res;
}

gaylord dot aulke at 100days.de (2005-07-04 04:04:02)

I tried to use this function with PHP 5.0.4 under windows but the function does not seem to be implemented.
(Fatal error: Call to undefined function array_intersect_key())
This works as a workaround for 2 arrays at least:
function array_intersect_key($arr1, $arr2) {
$res = array();
foreach($arr1 as $key=>$value) {
if(array_key_exists($key, $arr2)) $res[$key] = $arr1[$key];
}
return $res;
}

aidan at php dot net (2005-05-29 08:51:02)

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

易百教程