PHP-vérifier si deux tableaux sont égaux

j'aimerais vérifier si deux tableaux sont égaux. Je veux dire: même taille, même indice, mêmes valeurs. Comment puis-je le faire?

en utilisant === comme suggéré par un utilisateur, je m'attends à ce que ce qui suit imprimerait enter si au moins un élément dans le(s) tableau (s) sont différents, mais en fait il ne le fait pas.

if (($_POST['atlOriginal'] !=== $oldAtlPosition) 
    or ($_POST['atl'] !=== $aext) 
    or ($_POST['sidesOriginal'] !=== $oldSidePosition) 
    or ($_POST['sidesOriginal'] !=== $sideext)) {

    echo "enter";
}
206
demandé sur simhumileco 2011-04-15 19:25:02

13 réponses

$arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs.
$arraysAreEqual = ($a === $b); // TRUE if $a and $b have the same key/value pairs in the same order and of the same types.

Voir Opérateurs De Réseaux .

MODIFIER

l'opérateur d'inégalité est != tandis que l'opérateur de non-identité est !== pour correspondre à l'égalité l'opérateur == et l'opérateur d'identité === .

385
répondu Stefan Gehrig 2011-04-16 08:27:15

Selon cette page .

NOTE: la réponse acceptée fonctionne pour les tableaux associatifs, mais elle ne fonctionnera pas comme prévu avec les tableaux indexés (expliqué ci-dessous). Si vous voulez comparer l'un d'eux, puis d'utiliser cette solution. De plus, Cette fonction peut ne pas fonctionner avec des tableaux multidimensionnels (en raison de la nature de la fonction array_diff).

testant deux tableaux indexés, dont les éléments sont l'ordre différent, en utilisant $a == $b ou $a === $b échoue, par exemple:

<?php
    (array("x","y") == array("y","x")) === false;
?>

c'est parce que ce qui précède signifie:

array(0 => "x", 1 => "y") vs. array(0 => "y", 1 => "x") .

Pour résoudre ce problème, utilisez:

<?php
function array_equal($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff($a, $b) === array_diff($b, $a)
    );
}
?>

comparant les tailles des tableaux a été ajouté (suggéré par super_ton) car il peut améliorer la vitesse.

63
répondu lepe 2017-08-25 09:16:36

essayez serialize. Cela vérifiera subarrays imbriqués aussi bien.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
30
répondu Iggi 2011-07-15 07:12:59

!=== ne fonctionnera pas parce que c'est une erreur de syntaxe. La bonne façon est !== (pas trois" égale à "des symboles)

9
répondu Sodhi saab 2012-08-30 15:52:24

comparez-les avec d'autres valeurs:

if($array_a == $array_b) {
  //they are the same
}

vous pouvez lire à propos de tous les opérateurs array ici: http://php.net/manual/en/language.operators.array.php Notez par exemple que === vérifie également que le type et l'ordre des éléments dans les tableaux sont les mêmes.

9
répondu Emil Vikström 2015-11-12 09:31:31

Vous pouvez utiliser array_diff_assoc pour vérifier les différences entre les deux.

7
répondu jeroen 2011-04-15 15:36:36

solution de travail courte qui fonctionne même avec des tableaux dont les clés sont données dans un ordre différent:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}
4
répondu Samuel Vicent 2016-09-16 13:22:47

une autre méthode pour vérifier l'égalité indépendamment de l'ordre de valeur fonctionne en utilisant http://php.net/manual/en/function.array-intersect.php , comme ainsi:

$array1 = array(2,5,3);
$array2 = array(5,2,3);
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

Voici une version qui fonctionne aussi avec des tableaux multidimensionnels en utilisant http://php.net/manual/en/function.array-uintersect.php :

$array1 = array(
    array(5, 2),
    array(3, 6),
    array(2, 9, 4)
);
$array2 = array(
    array(3, 6),
    array(2, 9, 4),
    array(5, 2)
);

if($array1 === array_uintersect($array1, $array2, 'compare') && $array2 === array_uintersect($array2, $array1, 'compare')) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

function compare($v1, $v2) {
    if ($v1===$v2) {
        return 0;
    }
    if ($v1 > $v2) return 1;
    return -1;
}
2
répondu whitebrow 2015-09-27 17:56:18

d'Une manière: (mise en œuvre de "égaux" pour http://tools.ietf.org/html/rfc6902#section-4.6 )

permet ainsi des tableaux associatifs dont les membres sont ordonnés différemment-par exemple, ils seraient considérés comme égaux dans toutes les langues sauf le php :)

// recursive ksort
function rksort($a) {
  if (!is_array($a)) {
    return $a;
  }
  foreach (array_keys($a) as $key) {
    $a[$key] = ksort($a[$key]);
  }
  // SORT_STRING seems required, as otherwise
  // numeric indices (e.g. "0") aren't sorted.
  ksort($a, SORT_STRING);
  return $a;
}


// Per http://tools.ietf.org/html/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}
1
répondu Mike McCabe 2014-06-10 22:55:03

array_diff-calcule la différence des tableaux

http://php.net/manual/en/function.array-diff.php

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

compare array1 avec un ou plusieurs autres tableaux et renvoie les valeurs de array1 qui ne sont présentes dans aucun des autres tableaux.

1
répondu Dmitriy Naumov 2017-10-18 12:00:32

Utiliser la fonction php array_diff(matrice1, matrice2);

il retournera la différence entre les tableaux. Si son vide, alors ils sont égaux.

exemple:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3'
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value4'
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print array = (0 => ['c'] => 'value4' ) 

exemple 2:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print empty; 
0
répondu Wolfgang Leon 2017-02-03 17:18:25

problème de syntaxe sur vos tableaux

$array1 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

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

var_dump($diff); 
0
répondu YEFFOU WAGOUM THIERRY HENRI 2018-03-20 15:06:38
if (array_diff($a,$b) == array_diff($b,$a)) {
  // Equals
}

if (array_diff($a,$b) != array_diff($b,$a)) {
  // Not Equals
}

de mon pov il est préférable d'utiliser array_diff que array_intersect parce qu'avec des vérifications de cette nature les différences retournées sont généralement moins que les similitudes, de cette façon la conversion de bool est moins avide de mémoire.

Edit notez que cette solution est pour les tableaux simples et complète le == et = = = = un affiché ci-dessus qui n'est valide que pour les dictionnaires.

0
répondu Marcos Fernandez Ramos 2018-08-20 17:06:48