array_diff_key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_diff_key使用键进行比较来计算数组的差集

描述

array_diff_key(array $array, array ...$arrays): array

array 中的键与 arrays 中的键进行比较,并返回差集。此函数类似于 array_diff(),但比较是在键而不是值上进行的。

参数

array

要从中比较的数组

arrays

要比较的数组

返回值

返回一个 array,其中包含 array 中的所有条目,这些条目的键在所有其他数组中都缺失。

变更日志

版本 描述
8.0.0 此函数现在可以仅使用一个参数调用。以前,至少需要两个参数。

范例

范例 #1 array_diff_key() 范例

来自 key => value 对的两个键仅在 (string) $key1 === (string) $key2 时被视为相等。换句话说,执行严格类型检查,因此字符串表示必须相同。

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

var_dump(array_diff_key($array1, $array2));
?>

上面的例子将输出

array(3) {
  ["blue"]=>
  int(1)
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}
<?php
$array1
= array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'yellow' => 7, 'cyan' => 8);
$array3 = array('blue' => 6, 'yellow' => 7, 'mauve' => 8);

var_dump(array_diff_key($array1, $array2, $array3));
?>

上面的例子将输出

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

注释

注意:

此函数只检查 n 维数组的一个维度。当然,您可以使用 array_diff_key($array1[0], $array2[0]); 检查更深层的维度。

参见

添加注释

用户贡献的注释 11 个注释

16
Ashton
16 年前
要返回唯一元素(那些在任何一个数组中只存在一次但在两个数组中都不存在的元素),请尝试
function array_unique_diff ($array1, $array2)
{
array_merge(array_diff_key($array1, $array2), array_diff_key($array2, $array1));
}

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

array_diff_key($array1, $array2)

返回

array ( 'red' => 2, 'purple' => 4 )

array_diff_key($array2, $array1)

返回

array ( 'yellow' => 7, 'cyan' => 8, )

array_unique_diff($array1, $array2);

返回

array ( 'red' => 2, 'purple' => 4, 'yellow' => 7, 'cyan' => 8, )
8
gk at anuary dot com
11 年前
改进的递归版本。

<?php
/**
* @author Gajus Kuizinas <[email protected]>
* @version 1.0.0 (2013 03 19)
*/
function array_diff_key_recursive (array $arr1, array $arr2) {
$diff = array_diff_key($arr1, $arr2);
$intersect = array_intersect_key($arr1, $arr2);

foreach (
$intersect as $k => $v) {
if (
is_array($arr1[$k]) && is_array($arr2[$k])) {
$d = array_diff_key_recursive($arr1[$k], $arr2[$k]);

if (
$d) {
$diff[$k] = $d;
}
}
}

return
$diff;
}
?>

最新版本维护在 https://github.com/gajus/flow/blob/master/flow.inc.php#L337.
7
sjungwirth at matrix-consultants dot com
16 年前
我需要一些不同的东西,即使多维数组中的键不匹配。将 $assoc 设置为 false 将仅检查缺少的键,否则它还会比较值。这同样基于 '2ge at 2ge dot us' 的函数

<?php

function n_array_diff_assoc ($a1, $a2, $assoc=true) {
$r = array();
if(
is_array(current($a1))):
foreach(
$a1 as $k => $v):
if(isset(
$a2[$k])):
$diff = n_array_diff($a1[$k], $a2[$k], $assoc);
if (!empty(
$diff)):
$r[$k] = $diff;
endif;
else:
$r[$k] = $v;
endif;
endforeach;
else:
$r = $assoc ? array_diff_assoc($a1, $a2) : array_diff_key($a1, $a2);
endif;
return
$r;
}
?>
5
maxence at pontapreta dot net
19 年前
似乎是一个很棒的函数,尤其是对于 n 维数组。唯一的问题是,我在 php 5.0.3 和 5.0.4 中找不到它。它真的存在吗?!:(

[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$
3
AiFiLTr0 [at host] invyl [dot] ath.cx
16 年前
'2ge at 2ge dot us' 建议的递归函数,如果没有任何差异,将为您提供空数组。
此函数的变体清理了空数组并修复了第一个建议版本中的一个错误。它 100% 有效
.
<?php
function array_diff_key_recursive ($a1, $a2) {
foreach(
$a1 as $k => $v) {
//$r[$k] = is_array($v) ? $this->array_diff_key_recursive($a1[$k], $a2[$k]) : array_diff_key($a1, $a2);
if (is_array($v))
{
$r[$k]=$this->array_diff_key_recursive($a1[$k], $a2[$k]);
}else
{
$r=array_diff_key($a1, $a2);
}

if (
is_array($r[$k]) && count($r[$k])==0)
{
unset(
$r[$k]);
}
}
return
$r;
}
?>
3
coder at gs dot com
16 年前
下面的 PHP4 版本仅单向工作。如果您切换数组,例如 (ar2, ar1),您将获得与 (ar1, ar2) 不同的结果。
0
ampf at egp dot up dot pt
18 年前
好吧,您可以在代码中实现更强大的功能

https://php.net/manual/en/function.array-diff.php#31364
-1
rhallsey at yahoo dot com
9 年前
这是一个简单的函数,如果第一个数组中的所有键都在第二个数组中找到,则返回 true,否则返回 false。

function same_keys ($a1, $a2) {
$same = false;
if (!array_diff_key($a1, $a2)) {
$same = true;
foreach ($a1 as $k => $v) {
if (is_array($v) && !same_keys($v, $a2[$k])) {
$same = false;
break;
}
}
}
return $same;
}

要检查两个数组是否具有相同的结构,忽略值,执行两次函数,第二次将参数颠倒。
-2
division-par-zero at zilon dot net
15 年前
您可以使用此函数来返回两个数组的差异!

<?php
function array_unique_diff_key ($array1, $array2)
{
if (
is_array($array1) && is_array($array2))
return
array_diff_key($array1, $array2) + array_diff_key($array2, $array1);
else if (
is_array($array1)) return $array1;
else if (
is_array($array2)) return $array2;
else return array();
}
?>
-3
vlad_mustafin at ukr dot net
18 年前
另一个替代变体 :)
<?
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;
}
}
?>
-6
2ge at 2ge dot us
18 年前
您好,如果您需要 n 维数组的 diff 键,这里有一个不错的解决方案
<?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;
}
?>
它将打印所有内容,即 $a2 中缺少的内容。
To Top