PHPKonf 2025 Baku

array_diff_assoc

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

array_diff_assocCalcula la diferencia de dos arrays, teniendo en cuenta las claves

Descripción

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

Compara array con los arrays arrays y devuelve la diferencia. A diferencia de la función array_diff(), las claves del array también se utilizan en la comparación.

Parámetros

array

El array a comparar

arrays

Arrays a comparar contra

Valores devueltos

Devuelve un array que contiene todos los valores del array array que no están presentes en los otros arrays.

Historial de cambios

Versión Descripción
8.0.0 Esta función puede ser llamada ahora con un solo parámetro. Anteriormente, al menos dos parámetros eran necesarios.

Ejemplos

Ejemplo #1 Ejemplo con array_diff_assoc()

En este ejemplo, el par "a" => "green" está presente en ambos arrays, y por lo tanto, no está presente en el resultado de la función. Por el contrario, el par 0 => "red" está presente en el resultado, ya que la clave de "red" es automáticamente asignada a 0 en el primer array, mientras que es asignada a 1 en el segundo array, ya que la clave 0 ya está asignada a yellow.

<?php
$array1
= array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

El ejemplo anterior mostrará :

Array
(
    [b] => brown
    [c] => blue
    [0] => red
)

Ejemplo #2 Ejemplo con array_diff_assoc()

Dos valores de los pares clave => valor se consideran iguales solo si (string) $elem1 === (string) $elem2 . En otras palabras, se realiza una verificación estricta en la representación en strings.

<?php
$array1
= array(0, 1, 2);
$array2 = array("00", "01", "2");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

El ejemplo anterior mostrará :

Array
(
    [0] => 0
    [1] => 1
)

Notas

Nota: Esta función solo verifica una dimensión de un array multidimensional. Es posible verificar subdimensiones utilizando, por ejemplo, array_diff_assoc($array1[0], $array2[0]);.

Nota: Es necesario asegurarse de que los argumentos se proporcionen en el orden correcto al comparar arrays similares con más claves. El nuevo array debe ser el primero de la lista.

Ver también

  • array_diff() - Calcula la diferencia entre arrays
  • array_diff_uassoc() - Calcula la diferencia entre dos arrays asociativos, utilizando una función de retrollamada
  • array_udiff_assoc() - Calcula la diferencia entre arrays con verificación de índices, compara los datos con una función de retrollamada
  • array_udiff_uassoc() - Calcula la diferencia entre dos arrays asociativos, compara los datos y los índices con una función de retorno
  • array_intersect() - Calcula la intersección de arrays
  • array_intersect_assoc() - Calcula la intersección de dos arrays con pruebas sobre los índices

add a note

User Contributed Notes 21 notes

up
64
Giosh
12 years ago
The array_diff_assoc_array from "chinello at gmail dot com" (and others) will not work for arrays with null values. That's because !isset is true when an array key doesn't exists or is set to null.

(sorry for the changed indent-style)
<?php
function array_diff_assoc_recursive($array1, $array2) {
$difference=array();
foreach(
$array1 as $key => $value) {
if(
is_array($value) ) {
if( !isset(
$array2[$key]) || !is_array($array2[$key]) ) {
$difference[$key] = $value;
} else {
$new_diff = array_diff_assoc_recursive($value, $array2[$key]);
if( !empty(
$new_diff) )
$difference[$key] = $new_diff;
}
} else if( !
array_key_exists($key,$array2) || $array2[$key] !== $value ) {
$difference[$key] = $value;
}
}
return
$difference;
}
?>

And here an example (note index 'b' in the output):
<?php
$a1
=array( 'a' => 0, 'b' => null, 'c' => array( 'd' => null ) );
$a2=array( 'a' => 0, 'b' => null );

var_dump( array_diff_assoc_recursive( $a1, $a2 ) );
var_dump( chinello_array_diff_assoc_recursive( $a1, $a2 ) );
?>
array(1) {
["c"]=>
array(1) {
["d"]=>
NULL
}
}

array(2) {
["b"]=>
NULL
["c"]=>
array(1) {
["d"]=>
NULL
}
}
up
5
telefoontoestel at hotmail dot com
11 years ago
an earlier post for recursive array_diff_assoc failed because isset returned false on an array element containing a null value. I updated the code so it compares null values too.

<?php
function array_diff_assoc_recursive($array1, $array2)
{
foreach(
$array1 as $key => $value)
{
if(
is_array($value))
{
if(!isset(
$array2[$key]))
{
$difference[$key] = $value;
}
elseif(!
is_array($array2[$key]))
{
$difference[$key] = $value;
}
else
{
$new_diff = array_diff_assoc_recursive($value, $array2[$key]);
if(
$new_diff != FALSE)
{
$difference[$key] = $new_diff;
}
}
}
elseif(!
array_key_exists($key, $array2) || $array2[$key] != $value)
{
$difference[$key] = $value;
}
}
return !isset(
$difference) ? 0 : $difference;
}
?>
up
18
Michael Richey
12 years ago
If you're looking for a true array_diff_assoc, comparing arrays to determine the difference between two, finding missing values from both, you can use this along with array_merge.

$a = array('a'=>1,'b'=>2,'c'=>3);
$b = array('a'=>1,'b'=>2,'d'=>4);
print_r(array_diff_assoc($a,$b));
// returns:
array
(
[c] => 3
)

print_r(array_diff_assoc($b,$a));
// returns
array
(
[d] => 4
)

print_r(array_merge(array_diff_assoc($a,$b),array_diff_assoc($b,$a)));
// returns
array
(
[c] => 3
[d] => 4
)
up
12
contact at pascalopitz dot com
18 years ago
The direction of the arguments does actually make a difference:

<?php
$a
= array(
'x' => 'x',
'y' => 'y',
'z' => 'z',
't' => 't',
);

$b = array(
'x' => 'x',
'y' => 'y',
'z' => 'z',
't' => 't',
'g' => 'g',
);

print_r(array_diff_assoc($a, $b));
print_r(array_diff_assoc($b, $a));
?>

echoes:

Array
(
)
Array
(
[g] => g
)
up
11
chinello at gmail dot com
18 years ago
The following will recursively do an array_diff_assoc, which will calculate differences on a multi-dimensional level. This not display any notices if a key don't exist and if error_reporting is set to E_ALL:

<?php
function array_diff_assoc_recursive($array1, $array2)
{
foreach(
$array1 as $key => $value)
{
if(
is_array($value))
{
if(!isset(
$array2[$key]))
{
$difference[$key] = $value;
}
elseif(!
is_array($array2[$key]))
{
$difference[$key] = $value;
}
else
{
$new_diff = array_diff_assoc_recursive($value, $array2[$key]);
if(
$new_diff != FALSE)
{
$difference[$key] = $new_diff;
}
}
}
elseif(!isset(
$array2[$key]) || $array2[$key] != $value)
{
$difference[$key] = $value;
}
}
return !isset(
$difference) ? 0 : $difference;
}
?>

[NOTE BY danbrown AT php DOT net: This is a combination of efforts from previous notes deleted. Contributors included (Michael Johnson), (jochem AT iamjochem DAWT com), (sc1n AT yahoo DOT com), and (anders DOT carlsson AT mds DOT mdh DOT se).]
up
5
dev5er6 at gmail dot com
11 years ago
Works more like the original function:

<?php

function array_diff_assoc_recursive ( )
{
$args = func_get_args ( );
$diff = array ( );
foreach (
array_shift ( $args ) as $key => $val )
{
for (
$i = 0, $j = 0, $tmp = array ( $val ) , $count = count ( $args ); $i < $count; $i++ )
if (
is_array ( $val ) )
if ( !isset (
$args[$i][$key] ) || !is_array ( $args[$i][$key] ) || empty( $args[$i][$key] ) )
$j++;
else
$tmp[] = $args[$i][$key];
elseif ( !
array_key_exists ( $key, $args[$i] ) || $args[$i][$key] !== $val )
$j++;
if (
is_array ( $val ) )
{
$tmp = call_user_func_array ( __FUNCTION__, $tmp );
if ( ! empty (
$tmp ) ) $diff[$key] = $tmp;
elseif (
$j == $count ) $diff[$key] = $val;
}
elseif (
$j == $count && $count ) $diff[$key] = $val;
}

return
$diff;
}

?>
up
6
benjamin at moonfactory dot co dot jp
20 years ago
Hi all,
For php versions < 4.3...

<?php
/**
* array_diff_assoc for version < 4.3
**/
if (!function_exists('array_diff_assoc'))
{
function
array_diff_assoc($a1, $a2)
{
foreach(
$a1 as $key => $value)
{
if(isset(
$a2[$key]))
{
if((string)
$value !== (string) $a2[$key])
{
$r[$key] = $value;
}
}else
{
$r[$key] = $value;
}
}
return
$r ;
}
}

?>
up
4
tero dot lahtinen at iki dot fi
7 years ago
array_diff_assoc will fail, if a value is something that can not be converted to a string.
up
6
Alexander Podgorny
19 years ago
NOTE: the diff_array also removes all the duplicate values that match to the values in the second array:

<