Position actuelle: Accueil> Derniers articles> Ignorez les problèmes de cas lors de l'utilisation de Array_Diff ()

Ignorez les problèmes de cas lors de l'utilisation de Array_Diff ()

M66 2025-05-14

Array_Diff () est une fonction très courante en PHP pour calculer les différences entre les tableaux. Autrement dit, il renvoie des éléments qui existent dans le premier tableau mais pas dans d'autres tableaux. Cependant, la fonction Array_Diff () est sensible à la casse lors de la réalisation de comparaisons. Autrement dit, si deux tableaux ont la même chaîne mais ont des cas supérieurs et inférieurs différents, Array_Diff () les considéreront comme des éléments différents.

1. Problèmes qui peuvent être rencontrés lors de l'utilisation de Array_Diff ()

1.1 Problème de cas lors de la comparaison des chaînes

Si vous souhaitez ignorer le cas lors de la réalisation de calculs de différence de tableau, l'utilisation de Array_Diff () conduira directement à des résultats inattendus. Par exemple, supposons que nous ayons deux tableaux, dont l'un contient des cordes avec des cas supérieurs et inférieurs différents:

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

Le résultat de la sortie est:

 Array
(
    [0] => Apple
    [1] => Banana
    [2] => Cherry
)

Ce code montre que Array_Diff () pense que "Apple" et "Apple" sont différents, bien que leur contenu soit le même. Étant donné que Array_Diff () est sensible à la casse par défaut, même si le contenu des deux chaînes est le même, tant que le cas est différent, il sera toujours considéré comme des éléments différents.

1.2 chaînes qui affectent les majuscules et les minuscules

Dans le développement réel, vous rencontrez souvent des situations où les chaînes contiennent des cas mixtes, tels que l'entrée de l'utilisateur, les champs stockés de la base de données ou les adresses d'URL. Lorsque vous devez comparer ces chaînes de cas mixtes, Array_Diff () peut provoquer des résultats inexacts.

Par exemple:

 $array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];
$result = array_diff($array1, $array2);
print_r($result);

Le résultat de la sortie est:

 Array
(
    [0] => https://example.com/Page
    [1] => https://m66.net/Home
)

Bien que le contenu réel de ces deux URL soit le même, Array_Diff () jugera à tort qu'ils sont différents en raison de cas différents.

2. Comment éviter ces problèmes?

Pour résoudre le problème de sensibilité des caisses mentionné ci-dessus, nous devons prendre quelques mesures supplémentaires. Voici quelques solutions possibles:

2.1 Convertir tous les éléments du tableau en minuscules (ou majuscules)

Une solution courante consiste à convertir toutes les chaînes dans les tableaux en cas uniforme (minuscules ou en majuscules), puis à effectuer des calculs Array_Diff () . Cela garantit que ce cas est ignoré lors de la comparaison.

 $array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];

$array1_lower = array_map('strtolower', $array1);
$array2_lower = array_map('strtolower', $array2);

$result = array_diff($array1_lower, $array2_lower);
print_r($result);

Résultat de sortie:

 Array
(
)

Après le traitement de cette façon, Array_Diff () pensera que "Apple" et "Apple" sont les mêmes, et finalement renvoyer un tableau vide, indiquant qu'il n'y a pas de différence.

2.2 Utilisation de fonctions de comparaison personnalisées

Si vous avez besoin de règles de comparaison plus complexes, vous pouvez utiliser array_udiff () , qui vous permet de passer une fonction de comparaison personnalisée pour gérer les problèmes de cas lors de la comparaison. Voici un exemple simple:

 function caseInsensitiveCompare($a, $b) {
    return strcasecmp($a, $b);
}

$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];

$result = array_uDiff($array1, $array2, "caseInsensitiveCompare");
print_r($result);

Résultat de sortie:

 Array
(
)

Ici, nous utilisons la fonction StrcasecMP () , qui fera des comparaisons insensibles à des cas, qui peuvent éviter efficacement les différences de cas.

2.3 Cas unifiée lors du traitement des URL

Si vous avez besoin de comparer les URL et que vous souhaitez ignorer le cas, en particulier la partie du nom de domaine, vous pouvez utiliser la fonction PARSE_URL () intégrée de PHP pour analyser l'URL, puis convertir uniformément le cas de la partie du nom de domaine. Par exemple:

 function normalize_url($url) {
    $parsed_url = parse_url($url);
    $parsed_url['host'] = strtolower($parsed_url['host']);
    return $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
}

$array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];

$array1_normalized = array_map('normalize_url', $array1);
$array2_normalized = array_map('normalize_url', $array2);

$result = array_diff($array1_normalized, $array2_normalized);
print_r($result);

Résultat de sortie:

 Array
(
)

En convertissant uniformément les noms de domaine en minuscules, vous pouvez éviter des comparaisons incorrectes en raison de différents cas en majuscules et en minuscules.