PHP Conference Nagoya 2025

Random\Randomizer::shuffleBytes

(PHP 8 >= 8.2.0)

Random\Randomizer::shuffleBytes指定された文字列の、バイト単位の順列を取得する

説明

public Random\Randomizer::shuffleBytes(string $bytes): string

指定された bytes のあり得る順列から、 等確率に選ばれた順列を返します。

指定された bytes のあり得る順列それぞれが、返される確率は等しくなります。

パラメータ

bytes

バイト単位でシャッフルする文字列

指定された文字列は変更されません。

戻り値

bytes の、 バイト単位の順列を返します。

エラー / 例外

例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
add a note

User Contributed Notes 1 note

up
1
okerem@github
1 year ago
For a unicode-safe shuffling;

<?php
$r
= new \Random\Randomizer();
$s = join($r->shuffleArray(mb_str_split($string)));
To Top