PHPでは、 str_shuffle()は、文字列内の文字順をランダムに破壊する一般的に使用される関数です。基本的な構文は非常に単純です:
<span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str</span></span><span>)
</span></span>
この関数は、入力として文字列を取得し、文字順に破壊される新しい文字列を返します。ただし、多くの場合、関数はうまく機能しますが、一部の開発者は、特に文字列が数字で構成されている場合、使用するときにいくつかの問題に遭遇する場合があります。
文字レベルのランダム化に基づいて、文字、数字、またはその他のシンボルであるかどうかを気にしない文字レベルのランダム化に基づいています。したがって、数字で構成される文字列を渡すと、 str_shuffle()は数字を内部的に並べ替えます。言い換えれば、これらの数値の順序を混乱させます。
例:
<span><span><span class="hljs-variable">$numbers</span></span><span> = </span><span><span class="hljs-string">"123456789"</span></span><span>;
</span><span><span class="hljs-variable">$shuffled</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$numbers</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$shuffled</span></span><span>;
</span></span>
出力結果(各実行):
<span><span>738156492
</span></span>
上記の例では、数字の順序が変更されました。これは、STR_SHUFFLE()の予想される動作です。
この問題は通常、開発者がSTR_Shuffle()の動作を誤解している場合に発生します。 str_shuffle()は文字に基づいてランダムに台無しにされるため、文字列の順序は変更されますが、文字列の文字セットは変更されません。つまり、渡された文字列に数値のみがある場合、返された文字列にはまったく同じ数字が含まれますが、順序は変更されました。
場合によっては、開発者は、ランダムに生成された数や識別子など、「完全に異なる」結果を期待する場合があります。ただし、混乱の結果はキャラクターの順序の変化にすぎず、キャラクターセットは変更されていないままであるため、開発者はそれが「非識別的」であると感じるかもしれません。
解決策:文字列に十分な多様性が含まれていることを確認するか、 STR_SHUFFLE()を呼び出す前に、ニーズを満たすために他のランダム化技術を組み合わせていることを確認できます。
関数の実装の観点から、 str_shuffle()は文字列のコンテンツタイプを気にしません。文字をランダムにソートするだけです。したがって、数値文字列とアルファベット文字列の処理は、違いはありませんが、まったく同じです。
例:
<span><span><span class="hljs-variable">$letters</span></span><span> = </span><span><span class="hljs-string">"abcdef"</span></span><span>;
</span><span><span class="hljs-variable">$numbers</span></span><span> = </span><span><span class="hljs-string">"123456"</span></span><span>;
</span><span><span class="hljs-variable">$shuffledLetters</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$letters</span></span><span>);
</span><span><span class="hljs-variable">$shuffledNumbers</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$numbers</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Shuffled Letters: "</span></span><span> . </span><span><span class="hljs-variable">$shuffledLetters</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Shuffled Numbers: "</span></span><span> . </span><span><span class="hljs-variable">$shuffledNumbers</span></span><span>;
</span></span>
出力結果(実行ごとに異なる):
<span><span><span class="hljs-attr">Shuffled Letters:</span></span><span> </span><span><span class="hljs-string">eabdcf</span></span><span>
</span><span><span class="hljs-attr">Shuffled Numbers:</span></span><span> </span><span><span class="hljs-number">453621</span></span><span>
</span></span>
ご覧のとおり、アルファベット順の文字列であろうと数値文字列であろうと、 str_shuffle()の効果は文字のランダムな混乱です。
str_shuffle()は、特殊文字、スペース、句読点を含む文字列を完全にサポートしています。文字列内の文字のタイプに関係なく、同じ方法でキャラクターをランダムに台無しにします。
例:
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$shuffled</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$shuffled</span></span><span>;
</span></span>
出力結果(実行ごとに異なる):
<span><span>H! oelrW llo,d
</span></span>
この例では、文字列の文字、句読点、スペースがすべて混乱しています。
特定の特定のシナリオで数値文字列を破壊し、出力が有効な数字(一意の識別子や検証コードなどなど)であることを期待する場合、破壊された文字列が有効な数値形式であることが保証されていないことに注意する必要があります。数値タイプに戻す必要がある場合は、予測不可能な問題に遭遇する可能性があります。
例えば:
<span><span><span class="hljs-variable">$numberString</span></span><span> = </span><span><span class="hljs-string">"123456"</span></span><span>;
</span><span><span class="hljs-variable">$shuffled</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_shuffle</span></span><span>(</span><span><span class="hljs-variable">$numberString</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> (</span><span><span class="hljs-keyword">int</span></span><span>) </span><span><span class="hljs-variable">$shuffled</span></span><span>;
</span></span>
Str_shuffle()は数値の順序を破壊しますが、整数に変換すると、先頭のゼロが失われる可能性があります(存在する場合)。
提案:数値のランダムシーケンスが必要で、文字列になりたくない場合は、数値タイプのランダム化により適したRAND()やMT_RAND()などの乱数を生成する他の関数を検討してください。
str_shuffle()は、ランダムに配置された文字であるため、返された文字列が一意であることを保証しません。特に検証コードまたは一意の識別子生成を実行するときに一意の文字列を生成する必要がある場合は、 uniqid()やrandom_bytes()を使用して一意性を確保するなど、他の方法を使用することを検討する必要があります。
例:
<span><span><span class="hljs-variable">$uniqueId</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(); </span><span><span class="hljs-comment">// 一意を生成しますID</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$uniqueId</span></span><span>;
</span></span>