今回はphpでFizzBuzzをやってみました。
考え方もjavascriptの時と同じようにひとつずつ分解して作っていきます。
今回は求めた値をhtmlのliタグでくくってみたいと思います。
1.入力した文字をブラウザに表示させてみる
結果が正しいかを判断するために、まずはphpで値をブラウザに表示できるようにします。
<?php
echo '1';
?>
これでブラウザ上に「1」と表示されていると思います。
2.ブラウザ上に1から100までの数字を表示させてみる
表示させられることが分かったので、次は1から100までの数字をブラウザ上に表示させてみましょう。
<?php
for($i = 1; $i <= 100; i++){
echo $i;
}
?>
今回もjs時と同じくfor文でループさせてみました。
3.数字をliタグで括ってみる
このあたりから全体像を意識し始めました。
通常、echoの後ろにある$iの前後にliタグを加えるとliタグをつけることができます。
しかし、FizzやBuzzなどの文字を表示させるための条件分岐の準備がまだできていません。
なので今回はliタグを別の箇所に用意することにします。
<?php
for($i = 1; $i <= 100; i++){
$result = $i;
echo '<li>' . $result . '</li>';
}
?>
ループで求めた値をresultという変数に入れます。
その上でechoで表示をさせます。
この方法だと条件分岐をしてもシンプルに見えるかなと思いました。
4.三項演算子で条件分岐をしていきます。
javascriptのときはif文で書いてから三項演算子に置き換えましたが、今回はいきなり三項演算子で書いてしまいます。
<?php
for($i = 1; $i <= 100; $i++){
$result = $i%3 === 0 ? ($i%5 === 0 ? 'FizzBuzz' : 'Fizz') : ($i%5 === 0 ? 'Buzz' : $i);
echo '<li>' . $result . '</li>';
}
?>
入れ子であまり綺麗なコードではないですがとりあえずこれで完成です。
入れ子状態を解消した書き方もやってみたのですが、こちらでは思ったように動作してくれません。
<?php
$setNum = 1;
$endNum = 100;
for($i = $setNum; $i <= $endNum; $i++){
$result = ($i%3 === 0 ? 'Fizz' : '') . ($i%5 === 0 ? 'Buzz' : '') || $i;
echo '<li>' . $result . '</li>';
}
?>
まとめ
javascriptもphpもプログラムを書く上での考え方は同じですね。
分解して作る過程で「変数の書き方」や「文字の接続方法」などはそれぞれの言語ルールとして覚える必要はありますが。。。
ただ、最後のコードがなぜ正しく動かないのか不明です。このコードのどこが悪いのかもう少し考えてみたいと思います。
【追記】
コメントで最後のコードが動かないのは「||」のせいだということを教えてもらいました。
そこでもう一度jsとphpのリファレンスを見直してみました。
その上でもう少しだけコードが短くならないものかとやってみました。
ベースにしたコードと最終版を並べて書いてみます
<ベースにしたコード>
<?php
for($i = 1; $i <= 100; $i++){
$result = $i%3 === 0 ? ($i%5 === 0 ? 'FizzBuzz' : 'Fizz') : ($i%5 === 0 ? 'Buzz' : $i);
echo '<li>' . $result . '</li>';
}
?>
<最終版のコード>
<?php
while($i++<100){
$result = $i%3? ($i%5? $i : 'Buzz'):($i%5? 'Fizz':'FizzBuzz');
echo '<li>' . $result . '</li>';
}
?>
ベースにしたコードから「これはなくても良くない?」と思ったものを取り去ったのが最終版のコードです。もうひとつ大きな違いとしては、ループをfor文からwhile文に変えました。こちらの方が文字数が少なくなるというのが変更した理由です。
でコードの中身を少し解説。
コード中の「$i%3」は$iを3で割ったときに余りがあるかを調べるものです。それを三項演算子を書くときに活かしたらコードを書くときの文字数が減るはず。
$i%3 ? 【余りがあるときの処理】 : 【余りがないときの処理】;
という式が成り立つことに気付きました。
あとは三項演算子を入れ子にして書き上げたのが最終版のコードです。
調べるともっと短く書いてあるコードもたくさん見かけました。
書いてあるのを読むとなんとなくわかった気になれるのですが、自分で書こうとするとできませんでした。今の私は最終版のコードが限界な感じがしています。