#目次
数値を3桁ごとに区切る
数値を小数点以下まで表示させる
乱数を生成する
ランダムな文字列を作成する
ユニークIDを生成する
#数値を3桁ごとに区切る
number_format()
関数を使う
第二引数で指定した小数点の桁より下は切り捨てられる
引数を指定しない場合は小数点以下が切り捨てられる
有効桁数は14桁でそれ以上はプラットフォームによる
echo number_format('98765432.1'); //98,765,432
echo number_format('110', 2); //110.00
#数値を小数点以下まで表示させる
sprintf()
関数かnumber_format()
関数を使う
sprintf()
関数を使う場合は%02f
のように指定すると少数第二位までの表示が、%05f
とすると少数第五位までが表示できる
number_format()
関数を使う場合は第二引数に小数点第何位までを表示するか指定することができる
カンマ区切りが不要な場合は第三引数にピリオド、第四引数に空文字を指定する
#乱数を生成する
mt_rand()
関数を使う
mt_rand(int $min, int $max): int
引数を設定しない場合は0からmt_getrandmax(): int
の値を返す
乱数を生成する場合はシード値を基にして決まった計算方法で求められるため、
同じシード値からは同じ値が同じ順番で生成されるため、暗号学的に安全ではない
mt_rand()
関数のシード値は自動的に決められるため設定はいらない
#ランダムな文字列を作成する
<?php
//generateRandomString()関数
//第一引数には文字数
//第二引数には使用する文字
function generateRandomString(int $len, string $elem = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=/!@#$%^&*()_+~`'): string
{
if ($len <= 0) return false;
if (!preg_match('/\A[\x21-\x7e]+\z/', $elem)) return false;
$chars = preg_split('//', $elem, -1, PREG_SPLIT_NO_EMPTY);
$chars = array_unique($chars);
$bytes = getRandomBytes($len);
if (strlen($bytes) <= 0) return false;
$str = '';
$charsLen = count($chars);
for ($i = 0; $i <= $len; $i++) {
//バイト文字からASCII値を取得して剰余演算で配列の添字を決定
$str .= $chars[ord($bytes[$i]) % $charsLen];
}
return $str;
}
//getRandomBytes()関数
//暗号学的に強いアルゴリズムで生成した乱数のバイト文字列を返す
function getRandomBytes(int $len): string
{
$bytes = '';
if (function_exists('openssl_random_pseudo_bytes')) $bytes = openssl_random_pseudo_bytes($len, $usable);
if ($usable == false) $bytes = '';
return $bytes;
}
暗号学的に安全な関数
OpenSSL拡張モジュール
が必要なのでfunction_exists())
関数でチェック
#ユニークIDを生成する
uniqid()
関数を使用する
第一引数を空文字で実行すると13
文字の文字列が生成される
第一引数に文字列を指定するとそれが文頭につく
第二引数にtrue
を指定すると23
文字のより推測されにくい文字列が生成される
echo uniqid(); //xxxxxxxxxxxxx
echo uniqid('', true); //xxxxxxxxxxxxxxxxxxxxxxx
echo uniqid('no.'); //no.xxxxxxxxxxxxx
uniqid()
関数はマイクロ秒単位で変化するので同じマイクロ秒であれば同じIDが生成されてしまう可能性がある
mt_rand()
関数で乱数を指定すれば異なるIDを生成できる
md5()
関数を使うことで桁数の揃ったIDを生成できる
echo md5(uniqid(mt_rand(), true))