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

Cet article t'a plu ? Si oui, je te propose de t'inscrire à ma dev letter pour recevoir régulièrement dans ta boîte mail mes conseils, mes nouveaux articles, des vidéos à voir, des outils à découvrir et encore bien d’autres choses.

Je m'inscris