Position actuelle: Accueil> Derniers articles> Misonnés communs: Direct Array_flip () Conséquences des données utilisateur

Misonnés communs: Direct Array_flip () Conséquences des données utilisateur

M66 2025-06-03

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.

Qu'est-ce que Array_flip () ?

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.

Question 1: Valeurs en double dans les données de l'utilisateur

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.

Question 2: Valeurs qui ne sont pas disponibles sous forme de clés (non-scalar)

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 .

Question 3: Comportement imprévisible causé par la variation du type de valeur

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.

Alternatives plus sûres

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:

Méthode 1: Collectez toutes les paires de valeurs clés

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

Résumé: L'utilisation de array_flip () nécessite des soins extrêmes

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 ??