For a unicode-safe shuffling;
<?php
$r = new \Random\Randomizer();
$s = join($r->shuffleArray(mb_str_split($string)));
(PHP 8 >= 8.2.0)
Random\Randomizer::shuffleBytes — 指定された文字列の、バイト単位の順列を取得する
指定された bytes
のあり得る順列から、
等確率に選ばれた順列を返します。
指定された bytes
のあり得る順列それぞれが、返される確率は等しくなります。
bytes
バイト単位でシャッフルする文字列
指定された文字列は変更されません。
bytes
の、
バイト単位の順列を返します。
Random\Randomizer::$engine
に存在する
Random\Engine::generate() メソッド
がスローした、あらゆる Throwable がスローされます。
例1 Random\Randomizer::shuffleBytes() の例
<?php
$r = new \Random\Randomizer();
// 文字列中のバイト列をシャッフルします
echo "«", $r->shuffleBytes("PHP is great!"), "»\n";
?>
上の例の出力は、 たとえば以下のようになります。
« ga rHs!PPiet»
例2 バイト単位でシャッフルするとUnicode文字は壊れる
<?php
$r = new \Random\Randomizer();
$unicode = "🍎, 🥝, 🍌, 🍑, 🍇";
$shuffled = $r->shuffleBytes( $unicode );
// バイト単位で ASCII でない文字をシャッフルすると、値が壊れてしまいます。
// その結果、(Unicode 置換文字によって示される)不正なシーケンスが生成されたり、
// 完全に異なる文字が出力に現れたりします。
echo "Original: ", $unicode, "\n";
echo "Shuffled: «", $shuffled, "»\n";
echo "Shuffled Bytes: ", bin2hex($shuffled), "\n";
?>
上の例の出力は、 たとえば以下のようになります。
Original: 🍎, 🥝, 🍌, 🍑, 🍇 Shuffled: «� ��,�����🍟,� �� �, �,��» Shuffled Bytes: 87208e912c8d9fa5f0f0f09f8d9f2cf09f208c9d20f02c209f2c8d8d
For a unicode-safe shuffling;
<?php
$r = new \Random\Randomizer();
$s = join($r->shuffleArray(mb_str_split($string)));