PHPプログラミング

最終更新日:
公開日:

レシピ

文字列

ランダムな文字列を作成する

乱数を取得する関数と配列を組み合わせて、指定した長さのランダムな文字列を作成する方法について解説します。

この記事のポイント

  • 簡単にランダムな文字列を作る
  • アルファベット、数字、記号でランダムな文字列を作る

目次

乱数と配列でランダムな文字列を作る

生成したい文字列で使用する文字をあらかじめ配列に格納し、mt_rand関数で乱数を生成して1文字ずつ取り出すことでランダムな文字列を生成していきます。

次のコードではアルファベット(大文字、小文字)と数字を配列に入れ、10文字の長さを持った文字列を作成します。

コード例

$res = null;
$string_length = 10;
$base_string = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0,1,2,3,4,5,6,7,8,9];

for( $i=0; $i<$string_length; $i++ ) {
	$res .= $base_string[mt_rand( 0, count($base_string)-1)];
}

var_dump($res);

実行結果

// 1回目
string(10) "62G82DutQ5"

// 2回目
string(10) "QsJIVaiVqG"

// 3回目
string(10) "WEeAd9to27"

解説

1行目〜3行目までは、変数の初期化を行っています。

$res = null;
$string_length = 10;
$base_string = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0,1,2,3,4,5,6,7,8,9];

1行目の$resは生成した文字列を格納するための変数です。

2行目の$string_lengthは作成する文字列の長さを指定します。
ここの数字を「5」にすれば5文字に、「20」にすれば20文字の文字列を取得することができます。

3行目の$base_stringは使う文字を全て格納した配列です。
今回は半角英数(大文字・小文字)を使っていますが、例えば他にも「(ハイフン)」や「_(アンダーハイフン)」などの記号を使いたかったり、その他の言語を混ぜたい場合にはこの配列に入れておきます。

続くfor文がランダム文字列を作成する部分です。
$string_lengthで指定した文字列の回数だけループします。

for( $i=0; $i<$string_length; $i++ ) {
	$res .= $base_string[mt_rand( 0, count($base_string)-1)];
}

mt_rand関数は乱数を取得するための関数で、引数で渡した範囲で乱数を返します。
今回は、count関数で配列の長さを取得して「-1」とすることで、配列の長さの範囲で乱数を取得できるように指定しています。

最後のvar_dump関数はデバッグなどで活躍するダンプ出力用の関数です。

var_dump($res);

ランダムな文字列に記号を含める

続いて、記号を加えてランダムな文字列を作っていきます。
今回は仕様として、記号が文字列の先頭に来ないように設定します。

コード例

$res = null;
$string_length = 10;
$base_string = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0,1,2,3,4,5,6,7,8,9,'*','-','_'];

for( $i=0; $i<$string_length; $i++ ) {
	if( $i === 0 ) {
		$res .= $base_string[mt_rand( 0, count($base_string)-4)];
	} else {
		$res .= $base_string[mt_rand( 0, count($base_string)-1)];
	}
}

var_dump($res);

実行結果

// 1回目
string(10) "20wJ5_x15Q"

// 2回目
string(10) "EWo*eBF8ey"

// 3回目
string(10) "3nDok4AwSB"

主な変更点は3行目の$base_stringに記号を追加しているところと、for文の中で1文字目だけ記号が入らないように確認しているところです。

for文の中に、新しくif文を追加しています。
$iが「0」の場合は1文字目の取得なので、このときのみmt_rand関数から取得する乱数の範囲を「-4」にして、記号が含まれないように制御しています。
今回は$base_stringに指定している記号の種類が3種類だけなので「-4」となりますが、もし使用する記号が10種類の場合は「-11」といった具合に調整する必要があります。