PHPでは、str_shuffle関数「str_shuffle()」を使用することで、指定された文字列をランダムにシャッフルすることができる。
パスワードの生成処理とかでよく使われる。はず。

str_shuffle() とは

str_shuffle() は文字列をシャッフルします。 考えられるすべての順列のうちのひとつを作成します。

PHP: str_shuffle – Manual

とのこと。

使用方法

echo str_shuffle('シャッフルしたい文字列');

文字数を指定する

substr関数等と組み合わせることで実現可能

echo substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, 12) 

関数にすると便利

function test__str_shuffle($length) {
    return substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, $length);
}
echo test__str_shuffle(12);

応用

大文字、小文字の英字、数字、記号など、指定した文字列を全てを含んだ文字列を生成したい場合

str_shuffle関数は、あくまで指定した文字列をランダムにシャッフルして返す関数であるため、指定した文字列が混在するかどうかをチェックし、混在すれば文字列を返し、混在しなければもう一度実行させる処理を繰り返し行うような、再帰関数を作ることで実現できる。

使用する文字列

// 英語 =>「 ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz 」
// 数字 =>「 0123456789 」
// 記号 =>「 _+-.,!@#$%^&*();/|<>"' 」

関数

function test__function($length){
 
	$shuffles = str_shuffle('ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz0123456789_+-.,!@#$%^&*();/|<>"\'');
	$str = substr(str_shuffle($shuffles), 0, $length);
    $character = preg_quote('_+-.,!@#$%^&*();/|<>"\'', '/'); //preg_quote() で記号をエスケープしておく
 
	//正規表現 preg_match() で大文字小文字の英字、数字、記号が混在するかどうかをチェック
    if ( preg_match('/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[{$character}]).*$/',$str) ) {
        //混在すれば文字列を返す
		return $str; 
	}
	else {
        //混在しなければもう一度関数を呼び出す
		return test__function($length);
	}
}

$length = 12; //生成したい文字数を指定
$random_str = test__function($length);
echo $random_str;

正規表現を使用した途端にわかりづらくなりますね…

参考

PHP: str_shuffle – Manual

PHP: substr – Manual

PHP: preg_quote – Manual