str_shuffle()
Notre article présente la fonction PHP str_shuffle(), qui réorganise aléatoirement les caractères d'une chaîne. Syntaxe, valeur de retour et exemples.
La fonction PHP str_shuffle() réordonne aléatoirement les caractères d'une chaîne et retourne le résultat sous forme d'une nouvelle chaîne. Chaque caractère de l'original est conservé exactement une fois — seules leurs positions changent — ainsi le résultat est toujours un anagramme de l'entrée avec la même longueur. Cette page couvre la syntaxe, la valeur retournée, des exemples exécutables, les pièges courants (dont un avertissement de sécurité critique) et les fonctions associées.
Syntaxe
str_shuffle(string $string): stringParamètres
$string(requis) — la chaîne d'entrée dont vous souhaitez mélanger les caractères.
Valeur de retour
str_shuffle() retourne une nouvelle chaîne contenant les mêmes caractères que $string dans un ordre aléatoire. La chaîne originale n'est pas modifiée, car PHP passe la valeur par valeur et la fonction retourne une nouvelle chaîne. La chaîne retournée a toujours la même longueur que l'entrée.
Exemple de base
Ici $string contient "Hello, World!". str_shuffle() réarrange ses 13 caractères de façon aléatoire et retourne le résultat mélangé, que nous stockons dans $shuffled et affichons. Comme l'ordre est aléatoire, vous verrez un arrangement différent à presque chaque exécution — mais les lettres, la virgule, l'espace et le point d'exclamation sont tous toujours présents.
Générer une chaîne ou un jeton aléatoire
Un cas d'utilisation courant consiste à construire un code aléatoire court en mélangeant un ensemble de caractères autorisés et en extrayant les premiers :
<?php
$pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$code = substr(str_shuffle($pool), 0, 6);
echo $code; // e.g. "K3PQ8A"Cela garantit l'absence de caractères répétés dans le code, puisque chaque caractère de l'ensemble apparaît au plus une fois après le mélange.
Avertissement de sécurité : ne pas l'utiliser pour les mots de passe ou les jetons
str_shuffle() n'est pas cryptographiquement sécurisé. En interne, il utilise le générateur de nombres pseudo-aléatoires à usage général de PHP, qui est prévisible et inadapté à tout contexte sensible à la sécurité. Ne l'utilisez jamais pour générer des mots de passe, des identifiants de session, des jetons de réinitialisation de mot de passe ou des clés API.
Pour des valeurs aléatoires sécurisées, utilisez random_int() ou random_bytes() :
<?php
// Cryptographically secure 16-character token
echo bin2hex(random_bytes(8)); // e.g. "9f2c1ab07e3d4501"Travailler avec des chaînes multi-octets (UTF-8)
str_shuffle() opère sur les octets, pas sur les caractères Unicode. Pour du texte ASCII pur, c'est la même chose, mais pour du texte multi-octets (comme les caractères accentués ou non latins), cela peut scinder un seul caractère entre les limites d'octets et produire une sortie invalide ou illisible :
<?php
// "héllo" — the é is two bytes in UTF-8, so shuffling bytes can corrupt it
echo str_shuffle("héllo"); // may produce broken charactersSi vous avez besoin de mélanger des caractères Unicode en toute sécurité, découpez d'abord la chaîne en caractères (par exemple avec preg_split('//u', ...)), mélangez le tableau et reassemblez-le.
Notes et pièges
- Le mélange est uniforme en ce sens que chaque permutation est également probable, mais le résultat n'est pas déterministe — vous ne pouvez pas le paramétrer directement. (L'initialisation du générateur global avec
mt_srand()l'affecte sur les anciennes versions de PHP, mais s'y fier est déconseillé.) - Passer une chaîne vide retourne une chaîne vide.
- Les caractères dupliqués restent dupliqués — mélanger
"aaa"retourne toujours"aaa". - La variable originale est inchangée ; assignez la valeur de retour pour conserver le résultat.
Fonctions associées
shuffle()— réordonne aléatoirement les éléments d'un tableau (pas d'une chaîne).str_split()— divise une chaîne en un tableau de caractères, utile pour un mélange sécurisé multi-octets.mt_rand()— génère un entier aléatoire.str_repeat()— répète une chaîne un nombre de fois donné.str_replace()— remplace les occurrences d'une sous-chaîne.