【PHP Tips】sprintf()を使いこなそう
こんにちは、inoueです。
インフルエンザの看病 * 3人分 + 学級閉鎖5日間 * 2回 = 私の有給休暇ほぼゼロ、な年の瀬を迎えております。
10月に付与してもらったばかりなのに…。世の中そんな母さん父さん多いだろうけど。お互い頑張りましょう!
さてさて。プログラミング言語の好き嫌いがあるように、ひとつのプログラミング言語の中でも「好きな関数」「いまいち使わない関数」があったりしませんか。
今日は私inoueの「好きだけど、ある部分がなかなか覚えられない関数」であるsprintf()について、この関数の便利さをご紹介したいと思います。
- sprintf — フォーマットされた文字列を返す
- http://jp.php.net/manual/ja/function.sprintf.php
sprintf()の便利な点
基本構文は次のとおりです:
//sprintf(フォーマットを定義する文字列, [差し込む変数1, [差し込む変数2 ...]]);
$format = "%sは%sが%sにエントリーします。";
$weekday = '月曜日';
$author = 'inoue';
$blog = 'バシャログ。';
$message = sprintf($format, $weekday, $author, $blog);
$message の出力結果は次のようになります。
月曜日はinoueがバシャログ。にエントリーします。
もちろん、
$message = "{$weekday}は{$author}が{$blog}にエントリーします。";
でもよいのですが、sprintfを使ったほうがスマートな感じがしませんか?
そして、このフォーマットを定義する文字列に挿入する変換指定子(%で始まる要素。文字列を差し込む場合は %s となります。 詳しくはマニュアルを参照ください)に順番を指定(%の次の1、2という数字)することができる点が、この関数の便利なところです。
$format1 = "%1\$sは%2\$sが%3\$sにエントリーします。";
$format2 = "%2\$sがが%3\$sにエントリーするのは、%1\$sです。";
$weekday = '月曜日';
$author = 'inoue';
$blog = 'バシャログ。';
$message1 = sprintf($format1, $weekday, $author, $blog);
$message2 = sprintf($format2, $weekday, $author, $blog);
例えば、上のように2つの出力フォーマットを用意した場合、変換指定子の数字を差し込み元となる変数の引数の順番に対応させるだけで、対応できてしまいます。
$message1と2 の出力結果は次のようになります。
$message1:
月曜日はinoueがバシャログ。にエントリーします。
$message2:
inoueがバシャログ。にエントリーするのは、月曜日です。
この順番は、複数回指定可能です。複数個所に同じ変数の値を差し込みたい場合など、便利です。
$format = "%1\$sの好物:%2\$s、%2\$s、%2\$s!";
$author = 'ishida';
$food = 'ラーメン';
$message = sprintf($format, $author, $food);
ishidaの好物:ラーメン、ラーメン、ラーメン!。
表組みなどを出力する際、列の入れ替えが生じても修正箇所はフォーマット定義のみで済んでしまうのは楽ちんです。
MVCフレームワークを使う場合が増えている昨今、なかなかこのような使い方はしませんが、素のPHPのみでプログラムを書くときはぜひ使ってみてください。
ちなみに、私がいまいち覚えられずにいるのが、順番指定の「%1\$s」の記号の順番なのです。今回たくさん書いたから少しは身になったかも?
おまけ
関連する関数として、引数を配列で渡せるvsprintf()も一緒に覚えておきましょう。
どちらを使うかの判断は、私は差し込み元となる配列の内容が単純ならばvsprintf、それ以外はsprintfとしています。
また、出力があれば当然入力用の関数sscanf()もあります。こちらもあわせてぜひ活用してみてください。