web-dev-qa-db-fra.com

PHP - Vérifie si deux tableaux sont égaux

Je voudrais vérifier si deux tableaux sont égaux. Je veux dire: même taille, même indice, mêmes valeurs. Comment puis je faire ça?

En utilisant !== comme suggéré par un utilisateur, je m'attends à ce que le texte suivant soit imprimé entrée si au moins un élément du ou des tableaux est différent, mais ce n'est pas le cas.

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

    echo "enter";
}
241
markzzz
$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 tablea .

EDIT

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

451
Stefan Gehrig

Selon cette page .

REMARQUE: La réponse acceptée fonctionne pour les tableaux associatifs, mais ne fonctionnera pas comme prévu avec les tableaux indexés (expliquée ci-dessous). Si vous souhaitez comparer l'un ou l'autre, utilisez cette solution. De plus, cette fonction peut ne pas fonctionner avec des tableaux multidimensionnels (en raison de la nature de la fonction array_diff).

Le test de deux tableaux indexés, dont les éléments sont dans un 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)
    );
}
?>

La comparaison des tailles de tableau a été ajoutée (suggérée par super_ton) car cela pourrait améliorer la vitesse.

76
lepe

Essayez de sérialiser. Cela vérifiera également les sous-tableaux imbriqués.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
31
Iggi

Comparez-les comme d'autres valeurs:

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

Vous pouvez lire tous les opérateurs de tableau ici: http://php.net/manual/fr/language.operators.array.php Notez par exemple que === vérifie également que les types et ordre des éléments dans les tableaux sont les mêmes.

9
Emil Vikström

!=== ne fonctionnera pas car c'est une erreur de syntaxe. La manière correcte est !== (et non trois symboles "égaux à")

9
Sodhi saab

Solution courte qui fonctionne même avec les 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) );
}
6
Samuel Vicent

Une autre méthode pour vérifier l’égalité indépendamment de l’ordre des valeurs fonctionne en utilisant http://php.net/manual/en/function.array-intersect.php , comme suit:

$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 les tableaux multidimensionnels 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
whitebrow
if (array_diff($a,$b) == array_diff($b,$a)) {
  // Equals
}

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

De mon point de vue pov, il vaut mieux utiliser array_diff que array_intersect car avec des vérifications de cette nature, les différences renvoyées sont généralement inférieures aux similitudes, ce qui permet à la conversion bool de consommer moins de mémoire.

Édition Notez que cette solution s’applique aux tableaux simples et complète les == et === ceux affichés ci-dessus, qui ne sont valables que pour les dictionnaires.

1

Un moyen: (implémenter 'considéré égal' pour http://tools.ietf.org/html/rfc6902#section-4.6 )

De cette façon, les tableaux associatifs dont les membres sont ordonnés différemment - par ex. ils seraient considérés égaux dans toutes les langues sauf 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
Mike McCabe

array_diff - Calcule la différence de tableaux

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

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

Compare array1 à un ou plusieurs autres tableaux et renvoie les valeurs dans array1 qui ne figurent dans aucun des autres tableaux.

1
Dmitriy Naumov

Si vous souhaitez vérifier les tableaux non associatifs, voici la solution:

$a = ['blog', 'company'];
$b = ['company', 'blog'];

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
0
Santo Boldižar
function compareIsEqualArray(array $array1,array $array):bool
{

   return array_diff($array1,$array2)==[];

}
0
dılo sürücü

Utilisez la fonction php array_diff (array1, array2);

Cela retournera la différence entre les tableaux. Si c'est vide, 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
Wolfgang Leon

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);