Dans PHP, Array_INTERSECT_UASSOC () est une fonction puissante mais mal comprise. Il est utilisé pour comparer les clés et les valeurs de plusieurs tableaux et comparer les clés via des fonctions définies par l'utilisateur pour renvoyer la pièce d'intersection. Cependant, c'est précisément parce que la façon dont les clés sont comparées peuvent être personnalisées, ce qui soulève un problème potentiel: comment s'assurer que la comparaison est exacte lorsque les types de clés sont différents (comme les chaînes et les entiers)?
Prenons rapidement l'utilisation de base de Array_INTERSECT_UASSOC () :
$result = array_intersect_uassoc(
['1' => 'apple', 2 => 'banana', 3 => 'cherry'],
[1 => 'apple', '2' => 'banana', 3 => 'berry'],
function ($a, $b) {
return strcmp((string)$a, (string)$b);
}
);
print_r($result);
Dans cet exemple, nous utilisons Strcmp () pour comparer les clés, notez que nous convertissons explicitement les clés en chaînes. Il s'agit d'éviter les défaillances de comparaison causées par différents types.
Les clés du tableau de PHP peuvent être des entiers ou des chaînes, et PHP les convertit automatiquement dans certaines situations. Par exemple, «1» sera automatiquement converti en un entier 1. Cette conversion automatique ne provoque pas de problèmes dans la plupart des cas, mais lorsque vous utilisez array_intersect_uassoc () , le problème peut émerger:
«1» et 1 peuvent être considérés comme les mêmes dans les tableaux normaux, mais sont différents par rapport à StrCMP () .
L'opérateur === de PHP exige que les types et les valeurs soient égaux, ce qui fait que de nombreux développeurs pensent que Array_INTERSECT_UASSOC () fait de même.
Mais en fait, Array_INTERSECT_UASSOC () s'appuie sur la fonction de comparaison que vous transmettez, donc le résultat dépend fortement de savoir si vous êtes conscient du problème de la conversion de type.
Pour éviter les erreurs de comparaison dues à différents types, les stratégies suivantes sont recommandées:
Le moyen le plus sûr est de convertir manuellement la clé en même type (généralement une chaîne ou un entier) dans la fonction de comparaison:
function normalize_key_compare($a, $b) {
return strcmp((string)$a, (string)$b);
}
Cela garantit que «1» et 1 sont traités comme les mêmes clés.
Si vous pouvez contrôler les données d'entrée, il est préférable d'unifier le type de clé lors de la construction du tableau. Par exemple, si vous êtes sûr que toutes les clés sont des nombres, vous pouvez écrire ceci:
$array1 = [
1 => 'apple',
2 => 'banana',
3 => 'cherry'
];
$array2 = [
1 => 'apple',
2 => 'banana',
3 => 'berry'
];
De cette façon, même si le comparateur Strcmp () par défaut est utilisé, il ne provoquera pas la confusion de type.
PHP changera automatiquement '01' en un entier 1, si vous souhaitez préserver les clés sous forme de chaîne, vous devez utiliser des citations et vous assurer qu'aucune conversion implicite ne se produit:
$array = [
'01' => 'value'
];
Mais une fois que vous avez écrit:
$array = [
01 => 'value'
];
La clé deviendra un entier 1.
Supposons que vous ayez deux ensembles de données provenant de différentes sources, l'un décodé de JSON et l'autre de la base de données. Les clés de JSON peuvent être des chaînes, tandis que les clés dans les bases de données sont des entiers:
$jsonData = json_decode('{"1":"apple","2":"banana"}', true);
$dbData = [
1 => 'apple',
2 => 'banana',
3 => 'cherry'
];
Vous voulez trouver l'intersection des deux, vous pouvez le gérer comme ceci:
$result = array_intersect_uassoc(
$jsonData,
$dbData,
function ($a, $b) {
return strcmp((string)$a, (string)$b);
}
);
print_r($result);
À ce stade, la sortie sera:
Array
(
[1] => apple
[2] => banana
)
Lorsque vous utilisez Array_INTERSECT_UASSOC () , assurez-vous de comprendre l'importance du mécanisme de comparaison des clés et de la cohérence du type. Voici quelques suggestions clés:
Assurez-vous toujours de votre type de clé;
Types unifiés lors de l'utilisation de fonctions de comparaison;
Si les résultats ne répondent pas aux attentes, vérifiez d'abord la différence de type des clés;
Si possible, normalisez la structure des données à l'avance.
La gestion correcte des types de clés peut non seulement éviter les bogues potentiels, mais également améliorer votre contrôle sur le système de type PHP. Pour plus de conseils pratiques sur les fonctions de tableau PHP, visitez https://gitbox.net/php-array-utils .