Position actuelle: Accueil> Derniers articles> Pourquoi Array_Diff () ne renvoie-t-il pas le résultat que je m'attendais?

Pourquoi Array_Diff () ne renvoie-t-il pas le résultat que je m'attendais?

M66 2025-05-14

array_diff () est une fonction de tableau très pratique en php. Sa fonction est de renvoyer des valeurs dans un tableau qui existe dans le premier tableau mais pas dans d'autres tableaux. Bien que sa syntaxe semble simple, elle apparaît souvent lorsqu'elle est réellement utilisée, "Pourquoi le résultat est-il faux?" Cet article résumera les techniques de consommation d'erreur et de débogage communes pour vous aider à utiliser array_diff () plus efficacement.

1. Examen de l'utilisation de base

 $array1 = ["apple", "banana", "cherry"];
$array2 = ["banana", "cherry"];
$result = array_diff($array1, $array2);
print_r($result);

Sortir:

 Array
(
    [0] => apple
)

Comme vous pouvez le voir, Array_Diff () compare les valeurs, quel que soit le nom de clé et renvoie la pièce qui est dans $ array1 mais pas dans $ array2 .

2. Erreurs et pièges communs

1. Les types de données incohérents conduisent à une défaillance de correspondance

 $array1 = [1, 2, 3];
$array2 = ["2", "3"];
$result = array_diff($array1, $array2);
print_r($result);

Sortie attendue:

 Array
(
    [0] => 1
)

Sortie réelle:

 Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

En effet, array_diff () utilise des comparaisons non strictes (équivalent à == au lieu de === ). Dans certains cas, les chaînes et les nombres ne se convertissent pas avec succès, entraînant une défaillance de comparaison.

Solution: vous pouvez utiliser array_udiff () avec une fonction de comparaison personnalisée pour obtenir "une comparaison stricte":

 function strict_compare($a, $b) {
    return ($a === $b) ? 0 : 1;
}

$result = array_udiff($array1, $array2, 'strict_compare');
print_r($result);

2. Misonct lorsqu'il y a des valeurs en double dans le tableau

 $array1 = ["apple", "banana", "apple"];
$array2 = ["banana"];
$result = array_diff($array1, $array2);
print_r($result);

Sortir:

 Array
(
    [0] => apple
    [2] => apple
)

Remarque: Array_Diff () ne sera pas déducteur, il conservera toutes les valeurs non exclues et leurs noms de clés d'origine dans le tableau d'origine.

3. Effet des noms de clés de tableau associatif

 $array1 = ["a" => "apple", "b" => "banana"];
$array2 = ["banana"];
$result = array_diff($array1, $array2);
print_r($result);

Sortir:

 Array
(
    [a] => apple
)

Même si le tableau est un tableau associatif, array_diff () ne compare que les valeurs et ne compare pas les clés. Le nom de clé est juste conservé dans le résultat.

3. Compétences et suggestions de débogage

  1. Variables intermédiaires imprimées

     var_dump($array1, $array2);
    

    Assurez-vous que les deux tableaux que vous transmettez sont exempts de mélange de chaîne / numéro inattendu, d'espaces ou de problèmes de formatage.

  2. Vérifiez la structure des données à l'aide de JSON_ENCODE ()

     echo json_encode($array1);
    

    Aide à voir rapidement le type de la valeur ou s'il y a des caractères implicites (tels que des espaces, des pauses de ligne, etc.).

  3. Essayez de déboguer la fonction Si vous utilisez array_udiff () , n'oubliez pas d'ajouter des journaux ou de déboguer pour afficher la comparaison des valeurs dans la fonction de comparaison.

4. Cas réel: Problème de défaillance du filtrage de l'URL

Scène:

 $urls = [
    "https://m66.net/page1",
    "https://m66.net/page2",
    "https://m66.net/page3"
];

$visited = [
    "https://m66.net/page2",
    "https://m66.net/page3"
];

$unvisited = array_diff($urls, $visited);
print_r($unvisited);

Si l'une des URL a un espace de fuite ou une petite différence comme / , cela conduira également à l'incapacité de se comparer correctement!

Il est recommandé de nettoyer les données, puis de les comparer:

 $urls = array_map('trim', $urls);
$visited = array_map('trim', $visited);
$unvisited = array_diff($urls, $visited);

V. Conclusion

Array_Diff () est un outil puissant, mais comme il utilise une comparaison non stricte et uniquement des valeurs à comparer, il est facile de faire des erreurs dans le cas de types ou formats de données incohérentes. Ce n'est qu'en comprenant son comportement sous-jacent et en combinant les compétences de débogage appropriées que nous pouvons vraiment bien l'utiliser.

J'espère que cet article peut vous aider à dépanner et à résoudre le problème de "pourquoi le résultat est faux" que vous rencontrez lorsque vous utilisez array_diff () . Si vous rencontrez des scénarios ou des besoins de comparaison plus complexes, vous pouvez également envisager de combiner array_udiff () ou de logique personnalisée pour obtenir un contrôle plus granulaire.