Position actuelle: Accueil> Derniers articles> Notes lorsque vous utilisez array_diff ()

Notes lorsque vous utilisez array_diff ()

M66 2025-06-06

Dans PHP, Array_Diff () est une fonction très courante qui peut trouver les différences entre les tableaux. Mais lorsque nous l'utilisons pour faire face à un tableau associatif dans des projets réels, si nous ne comprenons pas comment cela fonctionne, nous pouvons tomber dans de nombreux "fosses".

Cet article expliquera en profondeur le comportement de Array_Diff () , les malentendus communs et certaines techniques pratiques dans le traitement associatif des tableaux.

1. Utilisation de base de Array_Diff ()

 $array1 = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
$array2 = ['a' => 'apple', 'b' => 'blueberry'];

$result = array_diff($array1, $array2);
print_r($result);

Sortir:

 Array
(
    [b] => banana
    [c] => cherry
)

Explication: Array_Diff () ne compare que la "valeur" et ignore le nom de la clé . Dans cet exemple, bien que les clés de $ array1 ['b'] = 'banana' soient les mêmes que $ array2 ['b'] = 'Blueberry' , 'Banana' est considérée comme l'une des différences dues aux différentes valeurs.

2. Malets et pièges communs

1. Ignorez la comparaison des noms de clés

Idée fausse: de nombreux développeurs pensent que Array_Diff () comparera les paires de valeurs clés.

 $a = ['id' => 1, 'name' => 'John'];
$b = ['name' => 'John', 'id' => 2];

var_dump(array_diff($a, $b));

Sortir:

 array(1) {
  ["id"]=>
  int(1)
}

Bien que 'name' => 'John' soit le même dans les deux tableaux, car array_diff () ne regarde pas la clé, il se concentre uniquement sur la question de savoir si la valeur existe. Donc 'id' => 1 est considéré comme différent car 1 n'est pas dans la valeur de $ b .

? Solution: si vous souhaitez comparer les clés et les valeurs en même temps, il est recommandé d'utiliser array_diff_assoc () :

 array_diff_assoc($a, $b);

Il comparera les clés et les valeurs en même temps, en évitant cette "illusion".

2. Ignorez la comparaison des types de données

 $a = ['value1' => 123];
$b = ['value2' => '123'];

print_r(array_diff($a, $b));

Sortir:

 Array
(
)

Pit Point: Array_Diff () utilise une comparaison stricte du bien ou du mal ( == ), donc 123 et «123» sont considérés comme les mêmes.

? Astuce: si vous avez besoin d'une comparaison stricte (les valeurs et les types doivent être cohérents), vous pouvez utiliser la variante Array_Diff_Uassoc de Array_Diff () avec une fonction de comparaison personnalisée.

 $result = array_udiff($a, $b, function($a, $b) {
    return $a === $b ? 0 : ($a > $b ? 1 : -1);
});

3. Erreur des attentes lorsqu'ils traitent des tableaux multidimensionnels

Array_Diff () est un outil de tableau unidimensionnel , et pour les tableaux multidimensionnels, il ne se compare pas récursivement.

 $a = ['info' => ['id' => 1, 'name' => 'Tom']];
$b = ['info' => ['id' => 1, 'name' => 'Tom']];

print_r(array_diff($a, $b));

Sortir:

 Array
(
    [info] => Array
        (
            [id] => 1
            [name] => Tom
        )
)

Cause: La valeur du type de tableau est traitée comme une chaîne dans array_diff () , et elle ne peut pas dire directement si le contenu des deux tableaux est égal.

? Solution: Si vous souhaitez comparer les tableaux multidimensionnels, vous devez écrire des fonctions récursives manuellement ou les comparer avec la conversion de sérialisation:

 $a_serialized = array_map('serialize', $a);
$b_serialized = array_map('serialize', $b);

$diff = array_diff($a_serialized, $b_serialized);

3. Compétences pratiques et scénarios d'application

Scénario 1: Déterminez si les données de la base de données ont été modifiées

Supposons que vous tirez un élément de données de la base de données à $ original , l'utilisateur soumet un formulaire à $ new_data , et vous voulez savoir quels champs ont changé:

 $original = ['name' => 'Alice', 'email' => 'a@m66.net'];
$new_data = ['name' => 'Alice', 'email' => 'alice@m66.net'];

$changed = array_diff_assoc($new_data, $original);

De cette façon, vous pouvez obtenir avec précision quels champs ont été modifiés par l'utilisateur.

Scénario 2: Comparaison des différences entre deux fichiers de configuration

Vous avez deux tableaux de configuration $ config1 et $ config2 :

 $config1 = include 'http://m66.net/config/old.php';
$config2 = include 'http://m66.net/config/new.php';

$diff = array_diff_assoc($config2, $config1);

Cela permet un accès facile aux modifications de configuration, particulièrement adaptées à l'écriture dans des scripts automatisés.

Résumer

méthode Comparez le contenu Si la distinction entre les types Adapté aux scènes
array_diff () Comparez les valeurs uniquement Non Comparaison de valeur simple
array_diff_assoc () Comparez la valeur + le nom de la clé Non Formulaire, comparaison de configuration
array_udiff () Méthode de comparaison personnalisée Personnalisable Comparaison de type strict
sérialiser + array_diff () Comparaison multidimensionnelle du tableau Non (évolutif) Comparaison de structure multidimensionnelle

Lorsque vous utilisez Array_Diff () , soyez clair sur ce que vous comparez. Ne soyez pas induit en erreur par les noms clés et n'oubliez pas l'impact du type. Ce n'est qu'en comprenant ces principes que vous pouvez vraiment utiliser cette fonction d'outil.

Si vous rencontrez des besoins de comparaison spéciaux dans votre projet, veuillez écrire une logique d'encapsulation de la fonction de gadget à la main - cela améliore non seulement la lisibilité du code, mais réduit également la probabilité de pénétrer dans une fosse.