Help us understand the problem. What is going on with this article?

PHPによる数値の諸処理と乱数

目次

数値を3桁ごとに区切る
数値を小数点以下まで表示させる
乱数を生成する
ランダムな文字列を作成する
ユニークIDを生成する

数値を3桁ごとに区切る

number_format()関数を使う
第二引数で指定した小数点の桁より下は切り捨てられる
引数を指定しない場合は小数点以下が切り捨てられる
有効桁数は14桁でそれ以上はプラットフォームによる

example.php
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()関数を使う

example.php
mt_rand(int $min, int $max): int

引数を設定しない場合は0からmt_getrandmax(): intの値を返す
乱数を生成する場合はシード値を基にして決まった計算方法で求められるため、
同じシード値からは同じ値が同じ順番で生成されるため、暗号学的に安全ではない
mt_rand()関数のシード値は自動的に決められるため設定はいらない

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

example.php
<?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文字のより推測されにくい文字列が生成される

example.php
echo uniqid(); //xxxxxxxxxxxxx
echo uniqid('', true); //xxxxxxxxxxxxxxxxxxxxxxx
echo uniqid('no.'); //no.xxxxxxxxxxxxx

uniqid()関数はマイクロ秒単位で変化するので同じマイクロ秒であれば同じIDが生成されてしまう可能性がある
mt_rand()関数で乱数を指定すれば異なるIDを生成できる
md5()関数を使うことで桁数の揃ったIDを生成できる

example.php
echo md5(uniqid(mt_rand(), true))
satorunooshie
経済学を学んでいる大学三年生です PHP, Kotlinを中心に学習しています 役に立てそうな英語の記事や詰まったところを共有していきます
https://satorunooshie.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away