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();
}
?>
array_diff_key
(PHP 5 >= 5.1.0)
array_diff_key — Registra a diferença entre arrays usando chaves para comparação
Descrição
Compara as chaves do array1 com as chaves do array2 e retorna a diferença. Esta função é como array_diff(), exceto que a comparação é feita com as chaves, ao invés dos valores.
Parâmetros
- array1
-
O array a comparar
- array2
-
Um array a ser comparado
- ...
-
Mais arrays a serem comparados
Valor Retornado
Retorna um array contendo todas as entradas de array1 que não estão presentes em qualquer dos outros arrays.
Exemplos
Exemplo #1 Exemplo de array_diff_key()
As duas chaves dos pares chave => valor são consideradas iguais somente se (string) $key1 === (string) $key2 . Em outras palavras, uma checagem de tipo estrita é feita para que representações de string sejam as mesmas.
<?php
$array1 = array('azul' => 1, 'vermelho' => 2, 'verde' => 3, 'roxo' => 4);
$array2 = array('verde' => 5, 'azul' => 6, 'amarelo' => 7, 'rosa' => 8);
var_dump(array_diff_key($array1, $array2));
?>
O exemplo acima irá imprimir:
array(2) {
["vermelho"]=>
int(2)
["roxo"]=>
int(4)
}
Notas
Nota: Essa função checa somente uma dimensão de um array n-dimensional. É claro que você pode checar dimensões mais profundas usando array_diff_key($array1[0], $array2[0]);.
Veja Também
- array_diff() - Analisa as diferenças entre arrays
- array_udiff() - Computa a diferença de arrays usando uma função de callback para comparação dos dados
- array_diff_assoc() - Computa a diferença entre arrays com checagem adicional de índice
- array_diff_uassoc() - Computa a diferença entre arrays com checagem adicional de índice que é feita por uma função de callback fornecida pelo usuário
- array_udiff_assoc() - Computa a diferença entre arrays com checagem adicional de índice, compara dados por uma função de callback
- array_udiff_uassoc() - Computa a diferença entre arrays com checagem adicional de índice, compara dados e índices por uma função de callback
- array_diff_ukey() - Computa a diferença de arrays usando uma função callback na comparação de chaves
- array_intersect() - Calcula a interseção entre arrays
- array_intersect_assoc() - Computa a interseção de arrays com uma adicional verificação de índice
- array_intersect_uassoc() - Computa a interseção de arrays com checagem de índice adicional, compara índices por uma função de callback
- array_intersect_key() - Computa a interseção de array comparando pelas chaves
- array_intersect_ukey() - Computa a interseção de arrays usando uma função de callback nas chaves para comparação
array_diff_key
03-Oct-2008 12:02
02-Apr-2008 07:33
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, )
28-Feb-2008 06:08
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;
}
?>
16-Feb-2008 08:00
The PHP4 version below works only unidirectionally. If you switch the arrays around i.e. (ar2, ar1) you get different results than (ar1, ar2).
29-Nov-2007 11:56
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;
}
?>
29-Jun-2007 10:01
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.
20-Dec-2006 10:27
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.
07-Mar-2006 05: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.
13-Jan-2006 01: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;
}
}
?>
25-Nov-2005 06:55
Well, you could implement in the code something more powerfull:
http://www.php.net/manual/en/function.array-diff.php#31364
07-Jun-2005 05: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';
}
?>
27-May-2005 03: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$
14-Apr-2005 01:28
Be aware that the last solution doesn't work if for any reason, two values are the same.
05-Mar-2005 12:58
<?php
function array_diff_key()
{
$args = func_get_args();
return array_flip(call_user_func_array('array_diff',
array_map('array_flip',$args)));
}
?>
23-Nov-2004 10: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;
}
}
