Déterminer si deux tableaux sont égaux
Il y a plusieurs moyens en PHP pour comparer deux tableaux. Nous allons en voir quelques-uns.
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
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 :
sort
modifie les tableaux) :sort($identique1);
sort($different);
var_dump($identique1 == $different); // true
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 ==
).
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.