%dって何?色々調べてみた


昨日、2ケタ✕2ケタの計算問題を作るプログラムをつくったら、コードについて早速突っ込まれました。

<?php
for($i = 1; $i <= 20; $i++) {
  $a = rand(10, 99);
  $b = rand(10, 99);
  $ans[] = $a * $b;
  printf("<p>(%02d) %d ✕ %d =</p>", $i, $a, $b);
}
echo implode(', ', $ans). '<br>';
?>

コードを作成してくださった方:iiOOii さん
また、変数a, b の記述についてはshiracamus さんに教えていただきました。
ありがとうございます。

僕のコードではforeachやifを使っていましたが、使わなくても記述ができるらしく。
教えてくださったコードについて色々調べてみました。

知らないコードばっかりでした笑

まだまだだな、と思い知らされます。
それもそのはず、まだ始めて1週間も経っていません。

ということで、知らないコードについて調べてみました。

  • printf
  • %d, %02d
  • implode

ほぼ全部知らないわけですが笑、頑張って調べました。
ということで、自分用に一つずつまとめていきます。

printf

以下、php公式より引用したものです。

フォーマット済みの文字列を出力する
printf ( string $format , mixed ...$values ) : int
format にしたがって、出力を生成します。

これだけ見たところで何も分かりませんが、指摘されたコードで何となくわかってきました。

printf("<p>(%02d) %d ✕ %d =</p>", $i, $a, $b);

確かpythonの出力はprintで表されるんですよね(phpはecho)。それに近い形なので、これも出力に関係しているのかなと推測できました。

そしてこのprintfは、出力変換指定子と言うそうです。出力形式を指定するときに使うらしい。
何となく分かってきました。

%d

printfは解決したものの、次にぶち当たる壁が%d

printf("<p>(%02d) %d ✕ %d =</p>", $i, $a, $b);

この%d、特に番号が割り振られていたりしないので「は?何この文字列」と首を傾げてしまいましたが笑、printfを見るとわかりました。

  • 一つ目の%02d$i
  • 二つ目の%d$a
  • 三つ目の%d$b

を呼び出しているみたいです。

dの部分についても色々と調べてみました。
どうやら符号ありの10進数を示すそうです。

ほかにも、文字列を指定したいときは%sを使うようですね。

%02dの「02」が表すもの

これは「0」「2」だけ、「20」と書いた場合などを調べてみましたが、
02で「数字を2ケタにそろえる」という意味っぽいです。
これで問題番号が1~9の場合は先頭に0がつくようになりました。

僕はこの処理をわざわざif構文で書いていたので笑、とても記述量が多くなっていました。

implode

こちらは調べると意外と簡単な関数でした。

implode(', '. $ans). '<br>';

これは$ans(answersの略)のそれぞれの要素の間に,をブチ込むという便利な代物です。
,おいにしたら、ちゃんと情緒不安定なヤツみたいになります。

$ans = [506, 1260, 1764, 720]
implode('おい '. $ans). '<br>';

//出力結果
506おい 1260おい 1764おい 720

これ、凄いのが出力の最後がカンマで終わらないこと。
上の例で言ったら720の後においがついていませんよね。
これはどこかで応用できそうです。

まとめ

以上の内容を踏まえて、コードをもう一度見直してみました。

<?php
for($i = 1; $i <= 20; $i++) {
  $a = rand(10, 99);
  $b = rand(10, 99);
  $ans[] = $a * $b;
  printf("<p>(%02d) %d ✕ %d =</p>", $i, $a, $b);
}
echo implode(', ', $ans). '<br>';
?>

とてもスッキリしていて気持ちがいい!
新しくプログラムを作るときは、なるべく記述量を節約していきたいなと思います。

繰り返しになりますが、教えてくださったiiOOii さん、shiracamus さん。ありがとうございました。