To return the unique elements (those with a key that exists only once in either array but not in both) try:
function array_unique_diff ($array1, $array2)
{
array_merge(array_diff_key($array1, $array2), array_diff_key($array2, $array1));
}
Example:
$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)
returns
array ( 'red' => 2, 'purple' => 4 )
array_diff_key($array2, $array1)
returns
array ( 'yellow' => 7, 'cyan' => 8, )
array_unique_diff($array1, $array2);
returns
array ( 'red' => 2, 'purple' => 4, 'yellow' => 7, 'cyan' => 8, )
array_diff_key
(PHP 5 >= 5.1.0)
array_diff_key — Dizilerin farkını hesaplarken indisleri karşılaştırır
Açıklama
$dizi1
, array $dizi2
[, array $...
] )
dizi1 ile dizi2'yi
karşılaştırır ve farkı döndürür. Değerler yerine anahtarları
karşılaştırması dışında array_diff() işlevi gibidir.
Değiştirgeler
-
dizi1 -
Karşılaştırılacak dizi.
-
dizi2 -
Karşılaştırılacak diğer dizi.
-
... -
Karşılaştırılacak diğer diziler.
Dönen Değerler
Diğer tüm değiştirgelerde mevcut olmayan dizi1
anahtarlarından oluşan bir dizi döner.
Örnekler
Örnek 1 - array_diff_key() örneği
İki anahtarın eşit olması için sadece ve sadece (string) $anahtar1 === (string) $anahtar2 olmalıdır. Başka bir deyişle, anahtarların dizgesel gösterimleri aynı olmalıdır.
<?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));
?>
Yukarıdaki örneğin çıktısı:
array(2) {
["red"]=>
int(2)
["purple"]=>
int(4)
}
Notlar
Bilginize:
Bu işlev n boyutlu bir dizinin sadece bir boyutunu karşılaştırır. Daha derinliğine karşılaştırmalar yapmak için array_diff_key($dizi1[0], $dizi2[0]); sözdizimini kullanabilirsiniz.
Ayrıca Bakınız
- array_diff() - Dizilerin farkını hesaplar
- array_udiff() - Veri karşılaştırması için bir geriçağırım işlevi kullanarak diziler arasındaki farkı bulur
- array_diff_assoc() - Dizilerin farkını hesaplarken ek olarak indisleri de karşılaştırır
- array_diff_uassoc() - Dizilerin farkını hesaplarken ek olarak bir geriçağırım işlevi üzerinden indisleri de karşılaştırır
- array_udiff_assoc() - Veri karşılaştırması için bir geriçağırım işlevi kullanarak diziler arasındaki farkı indislerine de bakarak bulur
- array_udiff_uassoc() - Veri ve indis karşılaştırması için bir geriçağırım işlevi kullanarak diziler arasındaki farkı indislerine de bakarak bulur
- array_diff_ukey() - Karşılaştırma için bir geriçağırım işlevi kullanarak dizilerin farkını hesaplar
- array_intersect() - Dizilerin kesişimini hesaplar
- array_intersect_assoc() - Dizilerin kesişimini hesaplarken ek olarak indisleri de karşılaştırır
- array_intersect_uassoc() - Dizilerin kesişimini hesaplarken ek olarak bir geriçağırım işlevi üzerinden indisleri de karşılaştırır
- array_intersect_key() - Karşılaştırma için anahtarları kullanarak dizilerin kesişimini hesaplar
- array_intersect_ukey() - Anahtarları karşılaştırmak için bir geriçağırım işlevi kullanarak dizilerin kesişimini hesaplar
you can use this function for return the difference of two array !
<?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();
}
?>
I needed something a little different where maybe even the keys in multidimensional arrays don't match up. Setting $assoc to false will cause only to check for missing keys, otherwise it compares values as well. This was also based on '2ge at 2ge dot us' function
<?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;
}
?>
The recursive function suggested by '2ge at 2ge dot us' will provide you with empty arrays if there's no diff.
This variant of the function cleans up empty arrays and fixes a bug in the first suggested version. It works 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;
}
?>
Well, you could implement in the code something more powerfull:
http://www.php.net/manual/en/function.array-diff.php#31364
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$
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.
The PHP4 version below works only unidirectionally. If you switch the arrays around i.e. (ar2, ar1) you get different results than (ar1, ar2).
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';
}
?>
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;
}
}
?>
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;
}
}
else one recursive variation.
<?php
$a = ['one' => 0, 'two' => ['y' => 0, 'x' => ['e' => 0, 'a' => 0]]];
$b = ['one' => 0, 'two' => ['y' => 0, 'x' => ['e' => 0, 'g' => 0]]];
function array_diff_key_recursive($a1, $a2) {
if (is_array($a2)) {
$r = array_diff_key($a1, $a2);
}
else {
return $a1;
}
foreach($a1 as $k => $v) {
if (is_array($v)) {
$r[$k] = array_diff_key_recursive($a1[$k], $a2[$k]);
if (is_array($r[$k]) && count($r[$k])==0) unset($r[$k]);
}
}
return $r;
}
?>
after kwutzke's comment , here is a PHP4 array_diff_key fonction for those in need
function PHP4_array_diff_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;
}
works for me, enjoy.
PHP4 array_diff_key can be copied from the array_intersect_key implementation posted by some anonymous user on 2006-07-17. The only thing you have to do is to delete the '!' in the if and rename the function.
<?php
function array_diff_key()
{
$args = func_get_args();
return array_flip(call_user_func_array('array_diff',
array_map('array_flip',$args)));
}
?>
