「3桁になるまで0で埋める」「テキストの桁を揃える」など、指定の長さになるまで文字列を埋めたい場面で便利なのが str_pad() です。この記事では基本の使い方から、ゼロ埋めの実用例、そして日本語で桁が揃わない落とし穴とその対策まで解説します。
この記事の結論:
str_pad($input, $length, $pad, $type) で埋めます。方向は STR_PAD_RIGHT(既定)/ STR_PAD_LEFT / STR_PAD_BOTH。ただしstr_padはバイト長で動くため、日本語など多バイト文字の桁揃えには使えない点に注意します。基本構文
str_padの構文
str_pad(string $input, int $length, string $pad = " ", int $type = STR_PAD_RIGHT): string
$input:元の文字列$length:仕上がりの長さ(これより元が長いと何もしない)$pad:埋める文字(既定はスペース)$type:方向(STR_PAD_RIGHT/STR_PAD_LEFT/STR_PAD_BOTH)
パディングの方向
右・左・両側
<?php
echo str_pad("Hello", 10); // "Hello "(右、既定)
echo str_pad("World", 10, "*", STR_PAD_LEFT); // "*****World"(左)
echo str_pad("PHP", 10, "#", STR_PAD_BOTH); // "###PHP####"(両側)
$length より元の文字列が長い場合、str_padは何もせずそのまま返します(切り詰めはしません)。よく使う:数値のゼロ埋め
連番やIDの桁を揃える「ゼロ埋め」は str_pad の定番用途です。STR_PAD_LEFT で左側を "0" で埋めます。
ゼロ埋め
<?php
echo str_pad("7", 3, "0", STR_PAD_LEFT); // "007"
echo str_pad("42", 5, "0", STR_PAD_LEFT); // "00042"
// ファイル連番などに
$no = 8;
echo "file" . str_pad($no, 3, "0", STR_PAD_LEFT) . ".txt"; // file008.txt
数値のゼロ埋めは
sprintf("%03d", $n) でも書けます。いろいろな0埋めの方法は0埋めをする方法まとめを参照してください。注意:日本語(多バイト)では桁が揃わない
重要な落とし穴です。str_pad() は「バイト数」で長さを数えます。UTF-8の日本語は1文字が3バイトなどになるため、見た目の文字数で揃えたつもりが揃いません。
多バイトでは意図どおりにならない
<?php
// "あ" は3バイト。5バイトに埋めるので、追加されるスペースは2個だけ
echo "[" . str_pad("あ", 5) . "]"; // [あ ] (見た目は3文字幅。5文字幅にならない)
echo strlen(str_pad("あ", 5)); // 5(バイト数)
日本語の表で桁を揃えたいときは、mb_strlen() で文字数を数えて不足ぶんを補う自作関数を使います。
mb対応の自作str_pad
<?php
function mb_str_pad(string $str, int $length, string $pad = " ", int $type = STR_PAD_RIGHT): string {
$diff = $length - mb_strlen($str);
if ($diff <= 0) return $str;
if ($type === STR_PAD_LEFT) {
return str_repeat($pad, $diff) . $str;
} elseif ($type === STR_PAD_BOTH) {
$left = intdiv($diff, 2);
return str_repeat($pad, $left) . $str . str_repeat($pad, $diff - $left);
}
return $str . str_repeat($pad, $diff); // RIGHT
}
echo "[" . mb_str_pad("あ", 5) . "]"; // [あ ](文字数で5に揃う)
なお等幅フォントでも全角は半角2つ分の幅になるため、半角と全角が混在する表は文字数で揃えても見た目はズレます。厳密な整列が必要なら、表示幅(全角=2・半角=1)で計算する必要があります。
実用例:テキストの表を整列する(半角の場合)
半角英数のデータなら、str_pad で各列の幅を揃えて表のように出力できます。区切り線は str_repeat が便利です。
テキストテーブル
<?php
$rows = [
["Name", "Age", "Job"],
["Alice", "30", "Engineer"],
["Bob", "22", "Designer"],
];
foreach ($rows as $i => $row) {
echo str_pad($row[0], 10) . str_pad($row[1], 5) . $row[2] . "\n";
if ($i === 0) echo str_repeat("-", 25) . "\n";
}
区切り線や繰り返し文字の作成は文字列を指定回数くり返す方法(str_repeat)、正確な文字数の取得は文字列の長さを正確に取得する方法を参照してください。
よくある質問(FAQ)
Q左側を0で埋めるには?
A
str_pad("7", 3, "0", STR_PAD_LEFT) で "007" になります。第3引数に "0"、第4引数に STR_PAD_LEFT を指定します。Q日本語で桁が揃いません。
A
str_pad() はバイト数で長さを数えるためです。日本語など多バイト文字は mb_strlen() を使った自作関数(本文の mb_str_pad)で文字数ベースに揃えてください。Q指定より元の文字列が長いとどうなりますか?
A何もせず、そのまま返します。str_padは切り詰めはしません。長すぎる場合に切るには
mb_substr() などと組み合わせます。Qstr_padとsprintfはどちらを使うべき?
Aゼロ埋めなど数値の整形は
sprintf("%03d", $n) が簡潔です。任意の文字での左右・両側パディングや文字列の整列には str_pad が向いています。まとめ
str_padのポイントを整理します。
str_pad($input, $length, $pad, $type)で指定長まで埋める- 方向は
STR_PAD_RIGHT(既定)/LEFT/BOTH - ゼロ埋めは
str_pad($n, 桁, "0", STR_PAD_LEFT) - 多バイト(日本語)はバイト長で動くため桁が揃わない → 自作
mb_str_pad - 元が長い場合は切り詰めず、そのまま返す
関連として、0埋めをする方法・文字列を指定回数くり返す方法・文字列の長さを正確に取得する方法もあわせて読むと、PHPの文字列整形に強くなれます。
