Lorsque vous traitez avec des tableaux PHP, array_flip () est une fonction de risque apparemment simple mais cachée. Son objectif est, mais lorsque vous l'utilisez directement pour les données fournies par l'utilisateur, elle peut déclencher une série de problèmes auxquels vous ne vous attendiez pas.
Cet article analysera les pièges potentiels de Array_flip () à travers des exemples et fournira des alternatives plus sûres pour vous aider à créer des applications PHP plus robustes.
L'utilisation de base de array_flip () est très intuitive:
$original = [
'apple' => 'fruit',
'carrot' => 'vegetable'
];
$flipped = array_flip($original);
print_r($flipped);
Sortir:
Array
(
[fruit] => apple
[vegetable] => carrot
)
Il modifie la valeur en une clé et la clé d'une valeur. Ceci est très utile dans certains scénarios, comme si vous souhaitez trouver rapidement des "clés" en fonction des "valeurs". Mais le problème est également caché dans cette définition.
array_flip () nécessite que toutes les valeurs doivent être uniques et disponibles par la clé lorsqu'elles sont retournées. Si vous avez des valeurs en double dans votre tableau, elle écrasera tranquillement les données précédentes sans donner d'invites d'erreur.
Jetons un coup d'œil à un exemple de données utilisateur:
$userInput = [
'user1' => 'admin',
'user2' => 'editor',
'user3' => 'admin' // Répéter la valeur
];
$flipped = array_flip($userInput);
print_r($flipped);
La sortie est:
Array
(
[admin] => user3
[editor] => user2
)
Pensez-vous que l'administrateur correspond à User1 ? Non, User3 le remplace. Il est facile de provoquer des erreurs logiques lors du traitement des rôles utilisateur, des autorisations, des balises et d'autres données.
Les clés du tableau en PHP ne peuvent être que des entiers ou des chaînes. Si le tableau soumis de l'utilisateur contient un tableau ou un objet sous forme de valeurs, array_flip () jette un avertissement et ignore ces éléments.
$userInput = [
'key1' => 'value1',
'key2' => ['not' => 'allowed'],
'key3' => 'value3'
];
$flipped = array_flip($userInput);
print_r($flipped);
Sortir:
Warning: array_flip(): Can only flip STRING and INTEGER values!
Array
(
[value1] => key1
[value3] => key3
)
Cet avertissement peut être vu dans un environnement de développement, mais caché dans un environnement de production et, par conséquent, vous obtenez un tableau qui semble normal mais qui a des données brisées .
Même si les valeurs se ressemblent, array_flip () distinguera strictement les types. Par exemple, la chaîne "1" et l'entier 1 sont traitées comme la même clé, ce qui provoquera un écrasement.
$userInput = [
'a' => 1,
'b' => '1'
];
$flipped = array_flip($userInput);
print_r($flipped);
Sortir:
Array
(
[1] => b
)
La clé "A" est complètement perdue.
Si vous avez besoin de la fonction des clés de vérification en arrière à partir des valeurs, mais que la source de données n'est pas digne de confiance, vous pouvez utiliser la méthode suivante:
$reverseMap = [];
foreach ($userInput as $key => $value) {
if (is_scalar($value)) {
$reverseMap[$value][] = $key;
}
}
De cette façon, les clés correspondant à toutes les valeurs en double peuvent être conservées:
print_r($reverseMap);
Sortir:
Array
(
[admin] => Array ( [0] => user1 [1] => user3 )
[editor] => Array ( [0] => user2 )
)
array_flip () est très utile lors de la gestion des données internes propres et bien structurées, mais utilisez-les avec prudence pour la saisie de l'utilisateur, sauf si vous le pouvez:
Assurez-vous que la valeur est unique
Assurez-vous que la valeur est de type scalaire (chaîne ou entier)
Connaissez votre objectif de flip clairement et soyez prêt à gérer les exceptions
Sinon, vous pouvez introduire tranquillement des bogues dans un coin, et jusqu'à un jour, l'utilisateur se plaint des erreurs d'autorisation dans le forum, vous vous rendez compte que le coupable est cette ligne de Array_flip () inoffensive.
J'espère que cet article peut vous aider à éviter une fosse cachée mais dangereuse. Si vous développez un système de gestion d'autorisation ou une fonction de mappage de données, vous pourriez aussi bien mettre Temporairement Array_flip () et envisager une solution plus robuste!
Pour plus d'études, veuillez vérifier:
?? https://m66.net/php-manual/array_flip
?? https://m66.net/php-best-practices
Si vous avez des questions d'utilisation similaires, veuillez laisser un message à discuter. Bien que le monde de PHP soit vieux, il y a un diable caché dans les détails ??