銀行の暗証番号のような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; }
関数にすると長くて制約のある前者の処理は無いな。
もっといい方法があれば教えて下さい。