【PHP】0埋めする簡単な方法(str_pad)

サイトなどを作っていると数字を0埋めしたいことがたまにあります。

デザイン上「1」「2」「3」ではなく、「01」「02」「03」としたいパターンとかですかね。画像で対応する場合は関係ないのですが、記事を読み込んだときに数字を連番で付ける場合には、「1」「2」「3」などの数字を自動で「01」「02」「03」という文字列にしたいです。

以前は「sprintf」を使っていたのですが、最近は「str_pad」を使って対応することが多いのでメモしておきます。

str_padを使って0埋めする

<?php
echo str_pad(1, 2, 0, STR_PAD_LEFT);
// ⇒「1」が「01」に変換され出力される

echo str_pad(2, 3, 0, STR_PAD_LEFT);
// ⇒「2」が「002」に変換され出力される
?>

「str_pad」を使って上記のように指定すれば簡単に0埋めされます。

引数について少し説明します。

  • 1つ目の引数・・・0埋めを行いたい文字を指定してください。例の場合だと「1」や「2」を指定しています
  • 2つ目の引数・・・0埋め後の文字数※最終的に「01」であれば2文字なので「2」になります
  • 3つ目の引数・・・「0」を指定してください
  • 4つ目の引数・・・「STR_PAD_LEFT」を指定してください

以上で、とりあえず使うことは出来るかと思います。引数についてもう少し詳しく下記にメモしておきます。興味のある方は見てみてください。

引数について

1つ目の引数

str_pad(1, 2, 0, STR_PAD_LEFT);

1つ目の引数は0埋めしたい数字です。「1」を「01」にしたい場合は、「1」、「2」を「002」にしたい場合は、「2」を指定すればOKです。

2つ目の引数

str_pad(1, 2, 0, STR_PAD_LEFT);

2つ目の引数は0埋め後の文字数です。「01」にしたい場合は2文字なので「2」を指定します。「002」の場合は0埋め後が3文字なので「3」と指定すればOKです。

3つ目の引数

str_pad(1, 2, 0, STR_PAD_LEFT);

3つ目の引数は何の文字で埋めるかを指定します。0埋めはもちろん「0」で埋めたいので「0」を指定すればOKです。

4つ目の引数

str_pad(1, 2, 0, STR_PAD_LEFT);

4つ目の引数は「STR_PAD_RIGHT」「STR_PAD_LEFT」「STR_PAD_BOTH」のいずれかを指定します。

3つ目の引数で指定した文字で埋めたい箇所が左側(STR_PAD_LEFT)なのか、右側(STR_PAD_RIGHT)なのか、両方(STR_PAD_BOTH)なのかを指定できます。0埋めは左側にすると思いますので、「STR_PAD_LEFT」を指定すればOKです。
※デフォルトが「STR_PAD_RIGHT」のため省略できません

参考:sprintfの場合

echo sprintf('%02d', 1); // 01
echo sprintf('%03d', 2); // 002

sprintfの場合は1つ目の引数「%02d」でstr_padの引数2つ目~4つ目をまかなえますw

str_padを使うよりもかなりスッキリした感じですね。「%02d」の部分に抵抗が無ければこちらの方が綺麗なソースにはなりそうです。
※str_padの記事にも関わらず、こちら推しみたいですね…。「str_pad」の良さはまとめで改めて書いておきます

(余談)0以外でも埋めることができる

余談ですが、str_pad の3つ目の引数に別の文字を指定すれば違う文字で埋めることもできます。

たとえば、下記のように指定すると「星3つ」の左側に★を3つ追加できます。

echo str_pad('星3つ', 16, '★', STR_PAD_LEFT);
// ⇒「星3つ」が「★★★星3つ」に変換され出力される

ただし、上のように2つ目の引数(埋めた後の文字数)に16を指定しています。これは漢字やひらがな、★などが全角文字のためです。文字数を15で指定すると★が出力しきれず文字化けしたりします。全角文字を作るには半角文字よりもバイト数が必要になります。そのあたりが影響しているのだと思います。

へー、そうなんだという程度で良いかなと思います。

基本的には0埋めで使うことが多いかと思いますので問題ないかとは思いますが、全角文字を使う場合は指定する文字列にご注意して使ってみてください

「01」を全角にしたい場合

あくまで1例ではありますが、もし「01」を全角にしたい場合は、「str_pad」で「01」を作って「mb_convert_kana」で半角数字を全角に変更するのが楽かなと思います。

<?php
$str_no1 = str_pad(1, 2, 0, STR_PAD_LEFT);
// ⇒「1」が「01」に変換される
echo mb_convert_kana($str_no1, "N");
// ⇒「01」が「01」に変換され出力される
?>

まとめ

sprintf」は1つ目の引数「%02d」に抵抗が無ければ非常に使いやすいと思います。ソースもスッキリしますし、メンテナンス上も良いかもしれません。

ですが、「%02d」に抵抗がある方は「str_pad」を使ってしまえば良いかなと思います。引数の数は増えてしまいますが、各引数の内容はとてもシンプルで悩むことはないでしょう。

どちらを選択しても0埋めは実現可能です。自分に合った方を使いましょう。個人的には記事を書くまで今後「str_pad」でいこうかと思っていましたが、いざ記事にしてみると「sprintf」の方がスッキリするなと感じだしました。

あまり使う機会はありませんが、次も悩むかもしれませんね(笑)。

最後に改めて、0埋め方法一式

str_padで0埋め

<?php
echo str_pad(1, 2, 0, STR_PAD_LEFT);
// ⇒「1」が「01」に変換され出力される

echo str_pad(2, 3, 0, STR_PAD_LEFT);
// ⇒「2」が「002」に変換され出力される
?>

str_padで0埋め&全角変換

<?php
$str_no1 = str_pad(1, 2, 0, STR_PAD_LEFT);
// ⇒「1」が「01」に変換される
echo mb_convert_kana($str_no1, "N");
// ⇒「01」が「01」に変換され出力される
?>

sprintfで0埋め

echo sprintf('%02d', 1); // 01
echo sprintf('%03d', 2); // 002