Déterminer si deux tableaux sont égaux

Il y a plusieurs moyens en PHP pour comparer deux tableaux. Nous allons en voir quelques-uns.

Les tableaux associatifs

Pour savoir si deux tableaux associatifs sont identiques, on peut utiliser les opérateurs == et ===.

La différence ?

  • == va vérifier que les associations clés/valeurs sont bien identiques dans les deux tableaux, peu importe l'ordre des clés et les types de clés et valeurs
  • === va vérifier que les associations clés/valeurs sont bien identiques dans les deux tableaux, dans le même ordre et du même type
 $identique1 = [
    'username' => 'John',
    'fullName' => 'John Doe',
    'age' => 42,
];

$identique2 = [
    'username' => 'John',
    'fullName' => 'John Doe',
    'age' => 42,
];

// ordre différent
$different1 = [
    'age' => 42,
    'username' => 'John',
    'fullName' => 'John Doe',
];

// type différents
$different2 = [
    'username' => 'John',
    'fullName' => 'John Doe',
    'age' => '42',
];
var_dump($identique1 == $identique2); // true
var_dump($identique1 === $identique2); // true
var_dump($identique1 == $different1); // true
var_dump($identique1 === $different1); // false
var_dump($identique1 == $different2); // true
var_dump($identique1 === $different2); // false

Ce comportement est identique si les clés sont des entiers "déclarés"

$identique1 = [
    0 => 'John',
    1 => 'Jane',
    2 => 'Baby',

];

$identique2 = [
    0 => 'John',
    1 => 'Jane',
    2 => 'Baby',
];

$different = [
    0 => 'John',
    2 => 'Baby',
    1 => 'Jane',

];

var_dump($identique1 == $identique2); // true
var_dump($identique1 === $identique2); // true
var_dump($identique1 == $different); // true
var_dump($identique1 === $different); // false

Les tableaux classiques

Dans le cas d'un tableau classique, si l'ordre des valeurs diffère, alors la comparaison avec == retournera aussi false (normal car la clé aura changé)

$identique1 = [
    'John',
    'Jane',
    42,
];

$identique2 = [
    'John',
    'Jane',
    42,

];

$different = [
    'John',
    42,
    'Jane',
];


var_dump($identique1 == $identique2); // true
var_dump($identique1 === $identique2); // true
var_dump($identique1 == $different); // false
var_dump($identique1 === $different); // false

Dans ce cas, plusieurs possibilités :

  • Trier les tableaux si l'ordre n'est pas important (attention la fonction sort modifie les tableaux) :
sort($identique1);
sort($different);

var_dump($identique1 == $different); // true
  • Utiliser la fonction array_diff :
var_dump(
    array_diff($identique1, $different) === [] &&
    array_diff($different, $identique1) === []
); // true

Cette méthode convertit les valeurs en string afin de les comparer ((string) $elem1 === (string) $elem2). Si on veut faire une comparaison plus stricte, il faut utiliser la méthode array_udiff

$identique1 = [
    'John',
    'Jane',
    42,
];

$different = [
    'John',
    'Jane',
    '42'
];

$strictCompare = fn($item1, $item2) => ($item1 === $item2) ? 0 : 1; 

var_dump(
    array_udiff($identique1, $different, $strictCompare) === [] &&
    array_udiff($different, $identique1, $strictCompare) === []
); // false

On ne peut pas utiliser le spaceship operator <=> dans la fonction anonyme, car il effectue une comparaison large (avec ==).

Tu aimerais progresser en PHP ? Mais tu ne sais pas comment t'y prendre ?

S'entraîner pour progresser en PHP

Mon programme "S'entraîner pour progresser en PHP" va bientôt ouvrir ses portes. Il te permettra de recevoir chaque semaine un kata de code directement dans ta boîte mail, ainsi que des aides à la réalisation, des vidéos explicatives, voire des live coding et de la review.

Si tu es intéressé(e), clique sur le bouton ci-dessous pour avoir plus d'informations et t'inscrire afin d'être prévenu(e) de l'ouverture de ce programme.