銀行の暗証番号のような0パディングありの4桁の数字を生成するとき、
$code = substr(mt_rand(10000, 19999), 1, 4);
こんな風に書いてみたけどどうだろう?
でも桁数が増えると重くなりそうだから、単純にmt_rand(0,9)の値を文字列に追加したほうがいいのかな?
$digits = 4;
$code = '';
for ($i = 0; $i < $digits; $i++) {
$code .= mt_rand(0, 9);
}
ちなみに前者の方法だとmt_randの引数のminがPHP_INT_MAXを超えるとfalseが返ってきちゃうから使えない。あと、一定数を超えると偶数に偏るそうだ。
桁数が少ない時はワンライナーで書ける前者、多い時は後者を関数にして使おうか。
/**
* @param int $digits 桁数
* @throws Exception
* @return string
*/
function getCode($digits = 4) {
$min = pow(10, $digits);
if ($min > PHP_INT_MAX) {
throw new Exception('Exceeded the PHP_INT_MAX');
}
$max = $min * 2 - 1;
return substr(mt_rand($min, $max), 1, $digits);
}
/**
* @param int $digits 桁数
* @return string
*/
function getCode($digits = 4) {
$code = '';
for ($i = 0; $i < $digits; $i++) {
$code .= mt_rand(0, 9);
}
return $code;
}
関数にすると長くて制約のある前者の処理は無いな。
もっといい方法があれば教えて下さい。
