array_diff_key

(PHP 5 >= 5.1.0RC1)

array_diff_key -- 使用键名比较计算数组的差集

说明

array array_diff_key ( array array1, array array2 [, array ...] )

array_diff_key() 返回一个数组,该数组包括了所有出现在 array1 中但是未出现在任何其它参数数组中的键名的值。注意关联关系保留不变。本函数和 array_diff() 相同只除了比较是根据键名而不是值来进行的。

例子 1. array_diff_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_diff_key($array1, $array2));
?>

上例将输出:

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

key => value 对中的两个键名仅在 (string) $key1 === (string) $key2 时被认为相等。换句话说,执行的是严格类型检查,因此字符串的表达必须完全一样。

注: 注意本函数只检查了多维数组中的一维。当然,可以用 array_diff_key($array1[0], $array2[0]); 来检查更深的维度。

参见 array_diff()array_udiff()array_diff_assoc()array_diff_uassoc()array_udiff_assoc()array_udiff_uassoc()array_diff_ukey()array_intersect()array_intersect_assoc()array_intersect_uassoc()array_intersect_key()array_intersect_ukey()


add a note add a note User Contributed Notes
2ge at 2ge dot us
08-Mar-2006 03:28
Hello, if you need diff key of n-dimensional arrays here is nice solution:
<?php
function n_array_diff ($a1, $a2) {
       foreach(
$a1 as $k => $v) {
          
$r[$k] = is_array($v) ? n_array_diff($a1[$k], $a2[$k]) : array_diff_key($a1, $a2);
       }
       return
$r;
}
?>
it will print everything, what is missing in $a2.
vlad_mustafin at ukr dot net
13-Jan-2006 11:39
One more alternative variant :)
<?
if (!function_exists('array_diff_key')) {
   function
array_diff_key() {
      
$argCount  = func_num_args();
      
$diff_arg_prefix = 'diffArg';
      
$diff_arg_names = array();
       for (
$i=0; $i < $argCount; $i++) {
          
$diff_arg_names[$i] = 'diffArg'.$i;
           $
$diff_arg_names[$i] = array_keys((array)func_get_arg($i));
       }
      
$diffArrString = '';
       if (!empty(
$diff_arg_names)) $diffArrString '$'.implode(', $', $diff_arg_names);
       eval(
"\$result = array_diff(".$diffArrString.");");
       return
$result;
   }
}
?>
ampf at egp dot up dot pt
26-Nov-2005 04:55
Well, you could implement in the code something more powerfull:

http://www.php.net/manual/en/function.array-diff.php#31364
ml at iceni dot pl
07-Jun-2005 03:52
You may obtain this function with PEAR Package PHP_Compat (http://pear.php.net/package/PHP_Compat)

Then using such code is quite useful
<?php
if(!function_exists('array_diff_key')){
   require_once
'PHP/Compat/Function/array_diff_key.php';
}
?>
maxence at pontapreta dot net
28-May-2005 01:38
Seems to be a great function, especially for n-dimensions arrays. The only problem is that I cannot find it in php 5.0.3 and 5.0.4. Does it really exist ?! :(

[20:27:05][maxence@conurb] ~/test2/php-5.0.4$ grep PHP_FUNCTION * -r | grep -i array_diff_key
[20:27:09][maxence@conurb] ~/test2/php-5.0.4$
nicolas at goinf dot com
14-Apr-2005 11:28
Be aware that the last solution doesn't work if for any reason, two values are the same.
eric dot broersma at phil dot uu dot nl
05-Mar-2005 10:58
<?php
function array_diff_key()
{
  
$args = func_get_args();
   return
array_flip(call_user_func_array('array_diff',
          
array_map('array_flip',$args)));
}
?>
denis noessler
23-Nov-2004 08:07
if (!function_exists('array_diff_key'))
{
   /**
   * Computes the difference of arrays using keys for comparison
   *
   * @param    array    $valuesBase            Base elements for comparison, associative
   * @param    array    $valuesComp[,..]    Comparison elements, associative
   *
   * @param    array                        Elements, not existing in comparison element, associative
   */
   function array_diff_key()
   {
       $argCount  = func_num_args();
       $argValues  = func_get_args();
       $valuesDiff = array();
      
       if ($argCount < 2)
       {
           return false;
       }
      
       foreach ($argValues as $argParam)
       {
           if (!is_array($argParam))
           {
               return false;
           }
       }
      
       foreach ($argValues[0] as $valueKey => $valueData)
       {
           for ($i = 1; $i < $argCount; $i++)
           {
               if (isset($argValues[$i][$valueKey]))
               {
                   continue 2;
               }
           }
          
           $valuesDiff[$valueKey] = $valueData;
       }
      
       return $valuesDiff;
   }
}