PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

array_diff_key> <array_count_values
Last updated: Fri, 11 Apr 2008

view this page in

array_diff_assoc

(PHP 4 >= 4.3.0, PHP 5)

array_diff_assoc — Comprueba las diferencias entre matrices teniendo en cuenta los índices

Descripción

array array_diff_assoc ( array $array1 , array $array2 [, array $ ... ] )

array_diff_assoc() devuelve una matriz que contiene todos los valores de array1 que no estén presentes en ninguna de las otras matrices que se pasan como argumento. Hay que tener en cuenta que las claves de los valores se utilizan en la comparación, a diferencia de array_diff().

Example #1 Ejemplo de array_diff_assoc()

<?php
$array1 
= array ("a" => "verde""b" => "negro""c" => "azul""rojo");
$array2 = array ("a" => "verde""amarillo""rojo");
$result array_diff_assoc ($array1$array2);

/* El resultado es:
Array
(
    [b] => negro
    [c] => azul
    [0] => rojo
)
*/
?>

En el ejemplo anterior se ve que el par "a" => "verde" está presente en ambas matrices y por ello no aparece en la matriz resultado. Por el contrario, el par 0 => "rojo" sí aparece en el resultado puesto que en el segundo argumento el valor "red" tiene la clave 1.

Dos valores de pares clave => valor se consideran iguales si y sólo si (string) $elem1 === (string) $elem2, es decir, cuando la representación de cadena es la misma.

Note: Hay que tener en cuenta que esta función sólo comprueba una dimensión de una matriz n-dimensional. Por supuesto, se pueden comprobar dimensiones sucesivas mediante: array_diff_assoc($array1[0], $array2[0]);.

Véase también array_diff(), array_intersect(), y array_intersect_assoc().



array_diff_key> <array_count_values
Last updated: Fri, 11 Apr 2008
 
add a note add a note User Contributed Notes
array_diff_assoc
cedric at daneel dot net
21-May-2007 06:01
To diff between n-dimensional array, juste use this :

function array_diff_values($tab1, $tab2)
    {
    $result = array();
    foreach($tab1 as $values) if(! in_array($values, $tab2)) $result[] = $values;
    return $result;
    }
contact at pascalopitz dot com
11-Apr-2007 04:14
The direction of the arguments does actually make a difference:

<?
$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
)
chinello at gmail dot com
18-Mar-2007 11:33
A small modification for array_diff_assoc_recursive from 'sc1n at yahoo dot com' , to 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;
}
?>
Alexander Podgorny
30-May-2006 02:30
NOTE: the diff_array also removes all the duplicate values that match to the values in the second array:

<?
    $array1 = array("a","b","c","a","a");
    $array2 = array("a");

    $diff = array_diff($array1,$array2);

    // yields: array("b","c") the duplicate "a" values are removed
?>
benjamin at moonfactory dot co dot jp
11-Jan-2005 09:56
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 ;
    }
}

Hope there's no bug,
cheers
?>
aidan at php dot net
09-Jun-2004 06:34
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat
Michael Johnson
26-Oct-2003 12:20
[jochem at iamjochem dawt com]
Here is a slightly enhanced version of Micheal Johnsons function.
This version accepts arguments in the same way as
array_diff_assoc (i.e. you can pass as many arrays as you want - any
arguments that are not arrays are ignored). If the first argument is not an array you automatically get empty array back:

The point of the function is to return all values in the first array
whose keys (only keys are checked!) are not present in any subsequently passed arrays.

[original post]
array_diff_assoc() requires that both the key and the value pairs match. To match based on keys only, try this function.

<?php
function array_diff_keys()
{
   
$args = func_get_args();

   
$res = $args[0];
    if(!
is_array($res)) {
        return array();
    }

    for(
$i=1;$i<count($args);$i++) {
        if(!
is_array($args[$i])) {
            continue;
        }
        foreach (
$args[$i] as $key => $data) {
            unset(
$res[$key]);
        }
    }
    return
$res;
}

// Example
$a = array('a' => '1', 'b' => '2', 'c' => '3');
$b = array('a' => '2', 'b' => '2', 'e' => '4');

// Yields array('a' => '1', 'c' => '3')
// Note that the 'a' index is not removed (as one might expect)
$c = array_diff_assoc($a, $b);

// Yields array('c' => '3')
$d = array_diff_keys($a, $b);
?>
sc1n at yahoo dot com
11-Jul-2003 12:10
[anders dot carlsson at mds dot mdh dot se]
The user contributed array_diff_assoc_recursive function is good except for the original array_diff_assoc always (?) returns an array.

Therefore I propose that $difference is initially set to an empty array (and the array is always returned), and the comparison against FALSE is replaced by count($new_diff). At least that's the modifications I made to run it they way my code expects.

[original post]
The following will recursively do an array_diff_assoc, which will calculate differences on a multi-dimensional level.  (Forgive me if the braces do not line up, the note script did not like my tabs, and gave me trouble on some spaces.)

<?php
function array_diff_assoc_recursive($array1, $array2)
{
     foreach(
$array1 as $key => $value)
     {
          if(
is_array($value))
          {
               if(!
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;
}
?>
carl at thep dot lu dot se
09-May-2003 02:55
To unset elements in an array if you know the keys but not the values, you can do:

<?php
$a
= array("foo", "bar", "baz", "quux");
$b = array(1, 3); // Elements to get rid of

foreach($b as $e)
  unset(
$a[$e]);
?>

Of course this makes most sense if $b has many elements or is dynamically generated.

array_diff_key> <array_count_values
Last updated: Fri, 11 Apr 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites