【PHP】ランダムな文字列を生成する方法(重複ありとなし)
前回ランダムな数値を生成することができる rand() 、 mt_rand() 関数についてのメモをとりました。
今回はこの「rand()」関数を使って、ランダムな文字列を生成するプログラムを作ってみようと思います。
ランダムなパスワード文字列を生成するときなどに使えるテクニックだと思いますので、頑張って覚えましょうφ(・_・”)メモメモ
mt_rand() 関数と配列を使って簡単なランダム文字列を作成する
早速作ってみましょう。まずは簡単なサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $wordarray = ["A","B","C","D","E","F","G","H","I","J"]; //ランダム文字に使用される要素 $count = count($wordarray)-1; //配列の要素数-1(配列の最大キー番号) $max = 10; //〇文字分取り出す for($i = 0;$i < $max;$i++){ $random = mt_rand(0,$count); echo $wordarray[$random]; } //実行結果例 ACIHGGADFB ?> |
まず「$wordwrray」という配列の中に、ランダム文字列生成に使用したい文字を入れていきます。
次に「$count」変数に「count(“$wordarray”)-1」とし、配列の中で一番大きなインデックス番号を取り出します。
「$max」変数にはランダム文字列の文字数を設定します。今回は「10」を設定しますが、ここを変えれば文字数を変えれるようにします。
最後に繰り返し構文の「for」を使用して「$random」変数に「0」から「$count」の間の数値をランダムで代入します。
そして「echo $wordarray[$random]」で配列内の何かが取り出されるという処理が合計10回行われる仕組みとなります。
ただこのランダム文字列には特徴があり、同じ文字が重複する可能性があるということです。
ビンゴやトランプのようなゲームを作る時、重複する数値が出て来てはバグになってしまいますよね?
次は重複する文字がでないようなプログラムを作ってみましょう。
重複しないランダム文字列を作成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $wordarray = [1,2,3,4,5,6,7,8,9,10]; //ランダム文字に使用される要素 $count = count($wordarray)-1; //配列の要素数-1(配列の最大キー番号) $max = 10; //〇文字分取り出す $array = []; //重複チェック用の配列を作成 for($i = 0;$i < $max;$i++){ while(true){ //"break" によって処理を抜けるまでループする $random = mt_rand(0,$count); //一時的なランダム数値を代入 if(! in_array( $random, $array )){ //もし $array 配列内に $random の数値が入っていなければ…(重複チェック) array_push($array,$random); //$array 配列に $random の数値をいれなさい break; // while のループから抜ける } } echo $wordarray[$array[$i]]; //$array に代入された数値に対応する、インデックス番号の$wordarray 配列の要素を出力する if($i != ($max-1)){ //スペースを入れるための記述です echo " "; } } ?> |
少し長くなってしまいましたね(;^ω^)
先程の重複していたものの違いとしては、「重複チェック」用の配列を作り、その中に重複のないランダムな数値を代入していきます(今回は $array という配列がチェック用です)。
while () の中のコードが、重複チェックのためのものです。$random にランダムな数値を($wordarray の最大インデックス番号以下の範囲で)代入し、それがもし、$array 、すなわち重複チェック用の配列の中に存在していれば再びランダムな数値を $random に代入して再び重複チェックを行います。この重複チェック作業がループし、もし配列内に存在していない数値ならば、その数値を配列内に代入し、break; によってループから抜け出します。
その後、この重複していない数値ばかりが格納された$array の配列を使用して、$wordarray から文字列を取り出すギミックとなります。
それでは実行結果を見てみましょう。
1 2 3 |
3 4 10 5 2 1 8 6 9 7 //1回目 6 8 5 2 1 10 4 7 3 9 //2回目 5 4 9 1 6 10 3 8 2 7 //3回目 |
三回ためしに動かしてみましたが、どうやら重複もなく、無事動いているようですね。
終わりに
今回はここまでです。今回は重複の有り無しで、ランダムな文字列を作成するプログラムを組んでみました。ランダムの文字列や数値の作成テクニックは、他に「最低一文字は、指定されたものをいれなさい」といったものや、「小数点以下のランダム数値の作成」など、まだまだ使いたいテクニックがあるので、またの機会に挑戦してみます。
それではお疲れ様でした(・ω・)ノシ