2024 年 PHP 日本大会

array_diff_key

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

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

描述

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

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

参数

array

要从中比较的数组

arrays

要比较的数组

返回值

返回一个数组,其中包含array中所有在其他所有数组中都不存在的键的条目。

变更日志

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

示例

示例 #1 array_diff_key() 示例

只有当(string) $key1 === (string) $key2 时,key => value对中的两个键才被认为是相等的。换句话说,执行严格的类型检查,因此字符串表示必须相同。

<?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]);检查更深的维度。

参见

添加注释

用户贡献的注释 10 条注释

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, )
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.
[email protected]
16 年前
我需要一个稍微不同的版本,即使多维数组中的键可能也不匹配。将 $assoc 设置为 false 将只检查缺少的键,否则它也会比较值。这也基于 '[email protected]' 的函数

<?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;
}
?>
[email protected]
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$
AiFiLTr0[at host]invyl[dot]ath.cx
17年前
'[email protected]' 提出的递归函数如果没有任何差异,将提供空数组。
这个函数的变体清理了空数组并修复了第一个建议版本中的一个错误。它工作正常 (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;
}
?>
[email protected]
16 年前
下面的PHP4版本仅单向工作。如果你交换数组,例如 (ar2, ar1),你得到的结果与 (ar1, ar2) 不同。
[email protected]
19年前
好吧,你可以在代码中实现更强大的功能

https://php.net/manual/en/function.array-diff.php#31364
[email protected]
10年前
这是一个简单的函数,如果第一个数组中的所有键都在第二个数组中找到,则返回 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;
}

要检查两个数组是否具有相同的结构(忽略值),请执行该函数两次,第二次反转参数。
[email protected]
16 年前
你可以使用此函数来返回两个数组的差异!

<?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();
}
?>
[email protected]
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;
}
}
?>
To Top