str_shuffle

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

str_shuffle随机打乱字符串

描述

str_shuffle(string $string): string

str_shuffle() 打乱一个字符串。将创建一个所有可能排列中的一个。

注意

此函数不会生成密码学安全的数值,并且不应用于密码学目的或需要返回不可猜测值的用途。

如果需要密码学安全的随机性,可以使用 Random\Randomizer 以及 Random\Engine\Secure 引擎。对于简单的用例,random_int()random_bytes() 函数提供了便捷且安全的 API,它由操作系统的 CSPRNG 支持。

参数

string

输入字符串。

返回值

返回打乱后的字符串。

变更日志

版本 描述
7.1.0 内部随机化算法 已更改 为使用 » 梅森旋转器 随机数生成器,而不是 libc rand 函数。

示例

示例 #1 str_shuffle() 示例

<?php
$str
= 'abcdef';
$shuffled = str_shuffle($str);

// 这将回显类似 bfdaec 的内容
echo $shuffled;
?>

参见

添加注释

用户贡献的注释 14 个注释

119
jojersztajner at OXYGEN dot POLAND
17 年前
根据埃林斯大学的一项研究,一个词中字母的顺序并不重要,唯一重要的是第一个和最后一个字母在正确的位置。其余的可以完全乱七八糟,你仍然可以毫无问题地阅读它。这是因为我们不是单独阅读每个字母,而是将整个单词作为一个整体来阅读。

以下是一段用这种方式打乱文本的代码
<?php
function scramble_word($word) {
if (
strlen($word) < 2)
return
$word;
else
return
$word{0} . str_shuffle(substr($word, 1, -1)) . $word{strlen($word) - 1};
}

echo
preg_replace('/(\w+)/e', 'scramble_word("\1")', 'A quick brown fox jumped over the lazy dog.');
?>

如果您想创建可读的 CTCPAHA,这可能很有用。
11
ronald
8 年前
此页面缺少一个非常重要的通知

注意

此函数不会生成密码学安全的数值,不应用于密码学目的。如果您需要密码学安全的数值,请考虑改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。
21
blamoo2 at hotmail dot com
9 年前
此函数受 srand() 影响

<?php
srand
(12345);
echo
str_shuffle('Randomize me') . '<br/>'; // "demmiezr aon"
echo str_shuffle('Randomize me') . '<br/>'; // "izadmeo rmen"

srand(12345);
echo
str_shuffle('Randomize me') . '<br/>'; // 再次为 "demmiezr aon"
?>
26
qeremy [atta] gmail [dotta] com
12 年前
一个正确的 Unicode 字符串打乱;

<?php
function str_shuffle_unicode($str) {
$tmp = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
shuffle($tmp);
return
join("", $tmp);
}
?>

$str = "Şeker yârim"; // 我的甜心

echo str_shuffle($str); // i�eymrŢekr �

echo str_shuffle_unicode($str); // Şr mreyeikâ
2
ccb2357 at gmail dot com
1 年前
<?php
function str_rand(int $length = 20) : string {
$ascii_codes = range(48, 57) + range(97, 122);
$codes_lenght = (count($ascii_codes)-1);
shuffle($ascii_codes);
$string = '';
for(
$i = 1; $i <= $length; $i++){
$previous_char = $char ?? '';
$char = chr($ascii_codes[random_int(0, $codes_lenght)]);
while(
$char == $previous_char){
$char = chr($ascii_codes[random_int(0, $codes_lenght)]);
}
$string .= $char;
}
return
str_shuffle($string);
}
?>
3
匿名
4 年前
如本文档中所述,str_shuffle 并非密码学安全的,但我在线上见过很多代码示例,人们仅仅使用它来生成随机密码。所以我想分享我的函数,虽然它使用了 str_shuffle,但也依赖于 random_int() 来增加安全性。我使用此函数来生成盐值,用于与散列值一起使用,但它也可以用于生成新用户的默认密码等。

它从一个可能的字符集合开始,在本例中包括所有字母(大小写)、数字 0-9 和一些特殊字符。

然后它将使用 `str_shuffle` 函数对字符集合进行随机次数的洗牌,使用 `random_int()` 函数(当前设置为 1-10)。

完成字符集合的洗牌后,它将再次使用 `random_int()` 函数在洗牌后的字符串中选择一个随机位置的字符,并对您想要输出的每个字符执行一次此操作。

function secret_gen( $len=64 ) {
$secret = "";
$charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=`~,<>.[]: |';
for ( $x = 1l $x <= random_int( 1, 10 ), $x++ ){
$charset = str_shuffle( $charset );
}
for ( $s = 1; $s <= $len; $s++ ) {
$secret .= substr( $charset, random_int( 0, 86 ), 1 );
}
return $secret;
}
3
wmtrader at yandex dot ru
4 年前
取消洗牌,使用
<?php
$string
= "Hello World!";

$seed = 1234567890;
mt_srand($seed);

echo
$sh = str_shuffle($string); //print 'eloWHl rodl!'
echo str_unshuffle($sh, $seed); //print 'Hello World!'
?>

<?php
function str_unshuffle($str, $seed){
$unique = implode(array_map('chr',range(0,254)));
$none = chr(255);
$slen = strlen($str);
$c = intval(ceil($slen/255));
$r = '';
for(
$i=0; $i<$c; $i++){
$aaa = str_repeat($none, $i*255);
$bbb = (($i+1)<$c) ? $unique : substr($unique, 0, $slen%255);
$ccc = (($i+1)<$c) ? str_repeat($none, strlen($str)-($i+1)*255) : "";
$tmp = $aaa.$bbb.$ccc;
mt_srand($seed);
$sh = str_shuffle($tmp);
for(
$j=0; $j<strlen($bbb); $j++){
$r .= $str{strpos($sh, $unique{$j})};
}
}
return
$r;
}
5
Anonymous
9 年前
`str_shuffle` 不适合用于生成密码。每个字符只出现一次。

以下函数更适合用于此目的。

<?php
function generatePassword($length = 8) {
$possibleChars = "abcdefghijklmnopqrstuvwxyz";
$password = '';

for(
$i = 0; $i < $length; $i++) {
$rand = rand(0, strlen($possibleChars) - 1);
$password .= substr($possibleChars, $rand, 1);
}

return
$password;
}
?>
5
CygnusX1
17 年前
为了结合上面两个函数的功能和简洁性,我们可以使用以下函数:

<?php
function generatePasswd($numAlpha=6,$numNonAlpha=2)
{
$listAlpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$listNonAlpha = ',;:!?.$/*-+&@_+;./*&?$-!,';
return
str_shuffle(
substr(str_shuffle($listAlpha),0,$numAlpha) .
substr(str_shuffle($listNonAlpha),0,$numNonAlpha)
);
}
?>
0
Anonymous
14 年前
对所有编码格式进行洗牌

<?php

function unicode_shuffle($string, $chars, $format = 'UTF-8')
{
for(
$i=0; $i<$chars; $i++)
$rands[$i] = rand(0, mb_strlen($string, $format));

$s = NULL;

foreach(
$rands as $r)
$s.= mb_substr($string, $r, 1, $format);

return
$s;
}

?>
-1
krzysiekpiasecki at gmail dot com
9 年前
/**
* 测试 `shuffleString`
*/
function testShuffleString() {
$shuffled = shuffleString("ĄęźćÓ");
if (\mb_strlen($shuffled) != 5) {
throw new \UnexpectedValueException("字符数量无效");
}
if ($shuffled == "ĄęźćÓ") {
throw new \UnexpectedValueException("相同的字符串");
}
foreach (["Ą", "ę", "ź", "ć", "Ó"] as $char) {
if (\mb_strpos($shuffled, $char) === false) {
throw new \UnexpectedValueException("字符未找到");
}
}
}

/**
* 洗牌字符串
*
* @param $stringValue 要洗牌的字符串
* @param string $startWith 对 `$stringValue` 进行洗牌并将结果追加到 `$startWith`
* @return string 洗牌后的字符串
* @author Krzysztof Piasecki<[email protected]>
*/
function shuffleString($stringValue, $startWith = "") {
$range = \range(0, \mb_strlen($stringValue));
shuffle($range);
foreach($range as $index) {
$startWith .= \mb_substr($stringValue, $index, 1);
}
return $startWith;
};

testShuffleString();

echo shuffleString("Hello"); // > 'elHol' (类似于此)
echo shuffleString("World!", "Hello "); // > 'Hello do!lrW' (类似于此)
-2
dzafel at op dot pl
17 年前
非常简单的随机密码生成器,不使用 `rand()` 函数

<?php
function random_password($chars = 8) {
$letters = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
return
substr(str_shuffle($letters), 0, $chars);
}
?>
-1
kundanborakb at gmail dot com
4 年前
<?php

// 获取指定长度的随机字符串

function getRandom($length){

$str = 'abcdefghijklmnopqrstuvwzyz';
$str1= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$str2= '0123456789';
$shuffled = str_shuffle($str);
$shuffled1 = str_shuffle($str1);
$shuffled2 = str_shuffle($str2);
$total = $shuffled.$shuffled1.$shuffled2;
$shuffled3 = str_shuffle($total);
$result= substr($shuffled3, 0, $length);

return
$result;

}

echo
getRandom(8);

//输出 -->
//GATv3JPX
//g7AzhDtR
//DTboKtiL
//CuWZR4cs
//tmTXbzBC

?>
-11
Michiel van den boogaard
19 年前
PHP < 4.3 的简短函数
<?php
function RandomPass($numchar)
{
$word = "a,b,c,d,e,f,g,h,i,j,k,l,m,1,2,3,4,5,6,7,8,9,0";
$array=explode(",",$word);
shuffle($array);
$newstring = implode($array,"");
return
substr($newstring, 0, $numchar);
}
?>
To Top