Position actuelle: Accueil> Derniers articles> Array_diff () correspond-il strictement lorsqu'il est en train de distinguer les types de valeur?

Array_diff () correspond-il strictement lorsqu'il est en train de distinguer les types de valeur?

M66 2025-06-06

Dans le développement quotidien, Array_Diff () est une fonction intégrée PHP très pratique. Il peut être utilisé pour comparer deux tableaux ou plus, renvoyant les valeurs dans le premier tableau mais pas dans le tableau suivant. Ceci est très courant dans des scénarios tels que le filtrage des données, la comparaison des différences de liste, etc.

La question est donc: array_diff () effectuera-t-il une correspondance de type stricte lors de la comparaison des valeurs? En d'autres termes, des éléments avec des types différents mais la même valeur seront considérés comme identiques ou différents?

1. Mécanisme de comparaison de valeur de Array_Diff ()

Dans PHP, Array_Diff () utilise une comparaison "non-stricte", c'est-à-dire qu'elle ne compare pas leurs types de données lorsqu'ils jugent si deux valeurs sont égales, mais se concentre uniquement sur la question de savoir si les valeurs sont "égales".

Cette méthode de comparaison est appelée "comparaison lâche" dans PHP, et elle se comporte de manière similaire aux jugements portés à l'aide de l'opérateur == , plutôt que === .

Exemple de code:

 <?php
$array1 = [1, 2, 3, "4"];
$array2 = ["1", 2, 4];

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

Résultat de sortie:

 Array
(
    [2] => 3
    [3] => 4
)

Dans cet exemple:

  • 1 (entier) et "1" (chaîne) sont considérés comme égaux et sont donc filtrés.

  • 3 et "3" ne sont pas dans $ array2 , donc réservés.

  • "4" et 4 sont considérés comme égaux et sont également filtrés.

Conclusion: PHP's Array_Diff () n'effectue pas de comparaison de type stricte.

2. Que dois-je faire si je veux utiliser une comparaison de type stricte?

Bien que Array_Diff () ne prenne pas en charge la comparaison stricte, PHP fournit une autre fonction array_diff_assoc () , qui compare les noms de clés en plus de comparer les valeurs.

Cependant, si nous ne nous soucions que de la comparaison stricte des valeurs, nous pouvons utiliser array_udiff () pour obtenir une comparaison stricte avec une fonction de comparaison personnalisée.

Exemple de code:

 <?php
$array1 = [1, 2, 3, "4"];
$array2 = ["1", 2, 4];

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

print_r($result);
?>

Résultat de sortie:

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

Dans cet exemple, 1 (int) et "1" (chaîne) sont traités comme des valeurs différentes , donc 1 est conservé. Cela atteint l'objectif d'une comparaison de type stricte.

3. Exemple pratique: pour le filtrage des données

Supposons que vous ayez une liste des ID de produit téléchargés par l'utilisateur (toutes les chaînes) et que vous souhaitez supprimer les ID (intégrales) qui existent déjà dans la base de données. Vous pouvez éviter une correspondance incorrecte dans une correspondance stricte:

 <?php
$uploadedIDs = ["101", "102", "103"];
$existingIDs = [101, 104];

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

// Supposons que vous ayez besoin d&#39;en construire un URL Montrez le reste ID
$url = "https://m66.net/products?ids=" . implode(",", $diff);
echo $url;
?>

URL de sortie:

 https://m66.net/products?ids=101,102,103

résumé

  • Array_Diff () utilise des comparaisons lâches, quelles que soient les différences de type;

  • Si vous devez correspondre strictement au type de valeur, vous pouvez utiliser array_udiff () avec une fonction de comparaison personnalisée;

  • Lorsque vous traitez avec les données utilisateur et le filtrage de données sensibles à type, il est recommandé d'utiliser des comparaisons strictes pour éviter les vulnérabilités logiques.

J'espère que cet article sera utile pour que vous compreniez le mécanisme de comportement des fonctions de différence de tableau dans PHP!