[PHP] 数値の先頭の0を取る4つの方法と速度

公開

スポンサーリンク

PHPで数値の先頭にある“0”を削除する方法についてまとめました。文字列型で数値を出力した際、先頭から0が連続しているのを取り除きたい場合があります。”0000123″のような文字列を、”123″と変換したいケースのことです。日時の表示で01月05日を1月5日に変える際などに必要となることが多いのではないでしょうか。

方法はいくつかあるので、4通りの方法と速度を調べました。

ltrim()を使う

$str = "000123";
$str = ltrim($str, "0");
echo $str;//123

文字列の左側(先頭)の空白を取り除く関数ltrim()を使う場合です。trim()系の関数はデフォルトでは空白のみを除去するのですが、第2引数で削除する文字を指定することが可能です。そこで、ltrim()に文字列をわたし、第2引数に0を指定すれば、文字列の先頭から連続する0を消し去ることができるというわけです。

int型に変換する

$str = "000123";
$str = (int)$str;
echo $str;//123

int型に変換します。数値型に変換すれば、当然先頭の0はなくなります。しかしながら、”01.23″のような文字列の先頭の0を削除する場合にはこの方法は使えません。小数点以下が存在する文字列の先頭の0を取り除くならfloat型に変換せねばなりません。文字列が必ず整数である場合にのみ使える方法です。

abs()を使う

$str = "000123";
$str = abs($str);
echo $str;//123

絶対値を求める関数abs()を使います。こちらの方法は小数点以下が存在する場合にも使えます。

preg_replace()を使う

$str = "000123";
$str = preg_replace("/^0+/u", "", $str);
echo $str;//123

正規表現で文字列を置換するpreg_replace()関数を使う方法です。先頭の0を取るくらいでわざわざ正規表現を使うのはどうなんだという気がします。

速度

0から始まる数値のみの文字列を作成し、上記の4通りの方法で先頭の0を削除するテストを各1万回行ってみました。

スピードは速い順にint型への変換 > abs() > ltrim() > preg_replace()でした。

int型への変換は常に最速でした。2番目に速いabs()より常に20%程度速かったです。2位のabs()と3位のltrim()にはそれほどの速度差はなく、0~5%でした。preg_replace()は著しく遅く、常にltrim()の2倍以上の時間がかかっていました。

結論

速度だけを考えればint型への変換ですが、常に使える方法というわけではありません。preg_replace()は段違いに遅いという欠点があります。abs()を使って0を除去するのは関数本来の使い方から外れています。そうやって考えると、文字列から不要な文字を削除するという本来の使い方に沿っていて、かつ速度の問題もないltrim()を使うのが良いのではないかと思います。

スポンサーリンク


Comment


  1. ななし : 投稿日:2016年9月14日 1:54 PM

    ltrimを使った場合の問題について

    元の値が「0000000」の場合に期待する結果は「0」であることが多いと考えられますが、実際は空文字となります。

    「単純に頭の0をカット」という事から考えると、「頭から続く全ての0がカット」というのが実際のltrimの挙動であるため、やや語弊があるのではないかと思いました。

    関数の仕様であるため仕方ないこととは思いますが、その時の対応についての調査もあると尚宜しいかと思いました。

    ちなみに、私はこのような状況ではint型に変換していますね。