2024 PHP Conference Japan

str_shuffle

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

str_shuffle隨機打亂字串

說明

str_shuffle(字串 $string): 字串

str_shuffle() 會打亂一個字串。將會建立所有可能排列中的一個。

注意

這個函式不會產生加密安全的數值,而且*絕對不可*用於加密用途,或需要傳回值不可預測的用途。

如果需要加密安全的隨機性,可以使用 Random\Randomizer 搭配 Random\Engine\Secure 引擎。對於簡單的應用場景,random_int()random_bytes() 函式提供了一個方便且安全的 API,它由作業系統的 CSPRNG 支援。

參數

字串

輸入字串。

傳回值

傳回已洗牌的字串。

更新日誌

版本 說明
7.1.0 內部隨機化演算法 已更改 為使用 » 梅森旋轉演算法 隨機數產生器,而非 libc rand 函式。

範例

範例 #1 str_shuffle() 範例

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

// 這個程式碼將會輸出類似:bfdaec 的結果
echo $shuffled;
?>

另請參閱

新增註記

使用者貢獻的註記 13 則註記

120
jojersztajner at OXYGEN dot POLAND
17 年前
根據英國某大學的研究,單字中字母的順序並不重要,唯一重要的是第一個和最後一個字母在正確的位置。其餘字母可以完全錯亂,您仍然可以毫無問題地閱讀它。這是因為我們不是逐個字母閱讀,而是將單字作為一個整體來閱讀。

這是一個以這種方式打亂文字的程式碼
<?php
函式 scramble_word($word) {
如果 (
strlen($word) < 2)
返回
$word;
否則
返回
$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.');
?>

如果您想創造一個類似 CAPTCHA 的東西,這可能很有用。
12
ronald
9 年前
此頁面缺少一個非常重要的注意事項

注意

此函式不會產生加密安全的數值,因此不應使用於加密目的。如果您需要加密安全的數值,請考慮改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。
22
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" 再次出現
?>
3
ccb2357 at gmail dot com
1 年前
<?php
函式 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);
}
?>
26
qeremy [atta] gmail [dotta] com
12 年前
一個正確的 Unicode 字串隨機排序函式;

<?php
函式 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â
4
匿名
5 年前
如同文件中所述,str_shuffle 並非密碼學安全的函式,然而我在網路上看過許多程式碼範例,人們只用這個函式來產生例如隨機密碼。因此,我想分享我的函式,它雖然使用了 str_shuffle,但也依靠 random_int() 來增加安全性。我使用這個函式來產生與雜湊一起使用的鹽值,但它也可以用來為新使用者產生預設密碼。

它從一個可能的字元集合開始,在這個例子中是所有字母(大小寫)、0-9 和幾個特殊字元。

它會使用 `random_int()` 函式(目前設定為 1-10)取得一個隨機數字,然後對所有可用字元執行 `str_shuffle` 函式進行隨機排序數次。

在所有可用字元被隨機排序後,它會再次使用 `random_int()` 函式,從已排序的字串中隨機選擇一個位置的字元,並針對您想要輸出的每個字元重複此動作。

function secret_gen( $len=64 ) {
$secret = "";
$charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=`~,<>.[]: |';
for ( $x = 1; $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;
}
4
wmtrader at yandex dot ru
4 年前
要還原排序,可以使用以下程式碼:
<?php
$string
= "Hello World!";

$seed = 1234567890;
mt_srand($seed);

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

<?php
函式 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;
}
6
匿名
10 年前
不建議使用 str_shuffle 來處理密碼。(每個字元只會出現一次)。

像下面這樣的函式比較適合用於此目的。

<?php
函式 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;
}
?>
6
CygnusX1
17 年前
為了結合以下兩個函式的功能和簡潔性,我們可以這樣做

<?php
函式 generatePasswd($numAlpha=6,$numNonAlpha=2)
{
$listAlpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$listNonAlpha = ',;:!?.$/*-+&@_+;./*&?$-!,';
return
str_shuffle(
substr(str_shuffle($listAlpha),0,$numAlpha) .
substr(str_shuffle($listNonAlpha),0,$numNonAlpha)
);
}
?>
1
匿名
14 年前
適用於所有編碼格式的隨機排序

<?php

函式 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;
}

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

?>
0
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<krzysiekpiasecki@gmail.com>
*/
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' (類似這樣)
-1
dzafel at op dot pl
17 年前
非常、非常簡單的隨機密碼產生器,不使用 rand() 函式

<?php
函式 random_password($chars = 8) {
$letters = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
return
substr(str_shuffle($letters), 0, $chars);
}
?>
To Top