Dans PHP, Str_Shuffle () est une fonction couramment utilisée qui perturbe aléatoirement l'ordre des caractères dans une chaîne. La syntaxe de base est très simple:
<span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str</span></span><span>)
</span></span>
Cette fonction prend une chaîne en entrée et renvoie une nouvelle chaîne perturbée dans l'ordre des caractères. Cependant, bien que la fonction fonctionne bien dans de nombreux cas, certains développeurs peuvent rencontrer des problèmes lors de l'utilisation, en particulier lorsque les chaînes sont composées de nombres.
Est str_shuffle () basé sur la randomisation au niveau des caractères, sans se soucier si les caractères sont des lettres, des nombres ou d'autres symboles. Donc, si vous passez dans une chaîne composée de nombres, str_shuffle () réorganisera les nombres en interne. En d'autres termes, il perturbe l'ordre de ces chiffres.
Exemple:
<span><span><span class="hljs-variable">$numbers</span></span><span> = </span><span><span class="hljs-string">"123456789"</span></span><span>;
</span><span><span class="hljs-variable">$shuffled</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$numbers</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$shuffled</span></span><span>;
</span></span>
Résultat de sortie (différent chaque exécution):
<span><span>738156492
</span></span>
Dans l'exemple ci-dessus, l'ordre des nombres a changé, qui est le comportement attendu de str_shuffle () .
Ce problème se produit généralement lorsque les développeurs comprennent mal le comportement de Str_Shuffle () . Étant donné que Str_Shuffle () est gâché au hasard en fonction des personnages, il modifie l'ordre des chaînes, mais ne change pas le jeu de caractères des chaînes. Autrement dit, s'il n'y a que des nombres dans la chaîne passée, la chaîne retournée contiendra toujours exactement les mêmes nombres, mais leur commande a changé.
Dans certains cas, les développeurs peuvent s'attendre à un résultat "complètement différent", comme un nombre ou un identifiant généré de manière aléatoire. Cependant, comme le résultat de la perturbation n'est qu'une transformation de l'ordre des caractères et que le jeu de caractères reste inchangé, les développeurs peuvent penser qu'il est "inutile".
Solution: Vous pouvez vous assurer que la chaîne contient suffisamment de diversité ou combiner d'autres techniques de randomisation pour répondre à vos besoins avant d'appeler str_shuffle () .
Du point de vue de l'implémentation de fonction, str_shuffle () ne se soucie pas du type de contenu dans la chaîne, il trie simplement les caractères au hasard. Par conséquent, le traitement des chaînes numériques et des chaînes alphabétiques est exactement la même, sans aucune différence.
Exemple:
<span><span><span class="hljs-variable">$letters</span></span><span> = </span><span><span class="hljs-string">"abcdef"</span></span><span>;
</span><span><span class="hljs-variable">$numbers</span></span><span> = </span><span><span class="hljs-string">"123456"</span></span><span>;
</span><span><span class="hljs-variable">$shuffledLetters</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$letters</span></span><span>);
</span><span><span class="hljs-variable">$shuffledNumbers</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$numbers</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Shuffled Letters: "</span></span><span> . </span><span><span class="hljs-variable">$shuffledLetters</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Shuffled Numbers: "</span></span><span> . </span><span><span class="hljs-variable">$shuffledNumbers</span></span><span>;
</span></span>
Résultat de sortie (différent pour chaque exécution):
<span><span><span class="hljs-attr">Shuffled Letters:</span></span><span> </span><span><span class="hljs-string">eabdcf</span></span><span>
</span><span><span class="hljs-attr">Shuffled Numbers:</span></span><span> </span><span><span class="hljs-number">453621</span></span><span>
</span></span>
Comme vous pouvez le voir, qu'il s'agisse d'une chaîne alphabétique ou d'une chaîne numérique, l'effet de str_shuffle () est un gâchis aléatoire de caractères.
str_shuffle () prend en charge entièrement des chaînes contenant des caractères spéciaux, des espaces et des marques de ponctuation. Il gâche au hasard les caractères de la même manière quel que soit le type de caractère dans la chaîne.
Exemple:
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$shuffled</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$shuffled</span></span><span>;
</span></span>
Résultat de sortie (différent pour chaque exécution):
<span><span>H! oelrW llo,d
</span></span>
Dans cet exemple, les lettres, la ponctuation et les espaces de la chaîne sont tous perturbés.
Si vous utilisez str_shuffle () pour perturber la chaîne numérique dans certains scénarios spécifiques et vous attendre à ce que la sortie soit un nombre valide (comme un identifiant ou un code de vérification unique, etc.), il convient de noter que la chaîne perturbée n'est plus garantie comme une forme numérique valide. Si vous devez le remettre en un type numérique, vous pouvez rencontrer des problèmes imprévisibles.
Par exemple:
<span><span><span class="hljs-variable">$numberString</span></span><span> = </span><span><span class="hljs-string">"123456"</span></span><span>;
</span><span><span class="hljs-variable">$shuffled</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$numberString</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> (</span><span><span class="hljs-keyword">int</span></span><span>) </span><span><span class="hljs-variable">$shuffled</span></span><span>;
</span></span>
Alors que STR_SHUXH () perturbe l'ordre des nombres, lors de la convertissement en un entier, des zéros principaux peuvent être perdus (s'ils sont présents), ce qui, dans certains cas, peut entraîner des erreurs.
Suggestion: Si vous avez besoin d'une séquence aléatoire de nombres et que vous ne voulez pas qu'elle devienne une chaîne, considérez d'autres fonctions qui génèrent des nombres aléatoires, tels que Rand () ou MT_RAND () , qui conviennent plus à la randomisation des types numériques.
str_shuffle () ne garantit pas que la chaîne retournée est unique car elle est juste un personnage organisé au hasard. Si vous devez générer des chaînes uniques, en particulier lorsque vous effectuez des codes de vérification ou une génération unique d'identifiant, vous devriez envisager d'utiliser d'autres méthodes, telles que l'utilisation d'Uniqid () ou Random_Bytes () pour assurer l'unicité.
Exemple:
<span><span><span class="hljs-variable">$uniqueId</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(); </span><span><span class="hljs-comment">// Générer uniqueID</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$uniqueId</span></span><span>;
</span></span>