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.
$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 .
$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);
$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.
$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.
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.
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.).
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.
$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);
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.