PHP Conference Japan 2024

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() 範例

只有當 (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]); 來檢查更深的維度。

參見

新增註解

使用者貢獻註解 10 則註解

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 <gk@anuary.com>
* @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
17 年前
'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
19 年前
嗯,您可以在程式碼中實作更強大的功能

https://php.dev.org.tw/manual/en/function.array-diff.php#31364
-1
rhallsey at yahoo dot com
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;
}

若要檢查兩個陣列是否具有相同的結構(忽略值),請執行此函數兩次,第二次將引數反轉。
-2
division-par-zero at zilon dot net
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();
}
?>
-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;
}
}
?>
To Top