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 ==).

Vous aimeriez progresser en PHP ? Mais vous ne savez pas comment vous y prendre ?

S'entraîner pour progresser en PHP

Mon programme "S'entraîner pour progresser en PHP" est disponible. Il vous permettra de recevoir chaque semaine un kata de code directement dans votre boîte mail, ainsi que des aides à la réalisation, des vidéos explicatives et des défis supplémentaires.

Reçois dès maintenant un kata gratuit en cliquant sur le bouton ci-dessous.