php

【PHP初心者の学習におすすめ】FizzBuzzのサンプル集

パソコンとphp

ども、現役エンジニアのてぃーぽです。(2018年8月現在)

主にphpで開発しています。

今回は有名な「FizzBuzz」のサンプルをPHPでいくつか紹介していきます。

ループ処理と条件分岐があるのでPHP初心者の学習におすすめです。

 

※ちなみにFizzBuzzとは

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

PCてぃーぽ

 

1.for文

for($i=1; $i<=100; $i++) {
if(($i % 3 == 0 && $i % 5 == 0)){
echo "FizzBuzz";
}elseif($i % 3 == 0 ){
echo "Fizz";
}elseif($i % 5 == 0){
echo "Buzz";
}else{
echo $i;
}
echo "<br>";
}

「for」のPHPマニュアルはこちら

ループ処理ではfor文が基本中の基本です。どの言語でも出てきます。

覚えようとしなくても絶対覚えるはめになるのでご安心ください。

2.while文

$count = 1;
while ($count <= 100){
if(($count % 3 == 0) and ($count % 5 == 0)){
echo "FizzBuzz";
}elseif($count % 3 == 0 ){
echo "Fizz";
}elseif($count % 5 == 0){
echo "Buzz";
}else{
echo $count;
}
$count++;
echo "<br>";
}

 

「while」のPHPマニュアルはこちら

while文はあまり書く機会はないです。てぃーぽはまだ業務で使ったことはないです。

3.foreach文

foreach (range(1,100) as $i) {
if(($i % 3 == 0 && $i % 5 == 0)){
echo "FizzBuzz";
}elseif($i % 3 == 0 ){
echo "Fizz";
}elseif($i % 5 == 0){
echo "Buzz";
}else{
echo $i;
}
echo "<br>";
}

「foreach」のPHPマニュアルはこちら

超有能なループ関数です。絶対に覚えてください!

ほとんどのループ処理はforeachでを使用することがほとんどです。これが使えるだけでできることが結構増えます。

ループ処理はforeachを利用するように心がけてください。

4.3項演算子を利用して

foreach (range(1,100) as $val) {
$val = ($val % 5 == 0 && $val % 3 == 0)?"FizzBuzz" : $val;
$val = ($val % 5 == 0 && $val % 3 !=  0)?"Buzz" : $val;
$val = ($val % 5 !=  0 &&$val % 3 == 0)?"Fizz" : $val;
echo $val . "<br>";
}

 

「3項演算子」の分かりやすいサイトはこちら

if文だと行須賀増えてしましますが、3項演算子だとスッキリ書くことができます。

「3項演算子」は悪だ!!

みたいな風潮もありますが、それは複雑な3項演算子を使用した場合です。(if文の方が直感的にわかりやすいけど)

今回みたいな単純な条件分岐であれば3項演算子を利用しましょう。まぁここは好みですね。

5.while × switch文

$i = 1;
while ($i <= 100){
switch($i % 15){
case 0:
echo "FizzBuzz";
break;
case 3:
case 6:
case 9:
echo "Fizz";
break;
case 5:
case 10:
echo "Buzz";
break;
default:
echo $i;
break;
}
echo "<br>";
$i++;
}

 

「switch」のPHPマニュアルはこちら

これはちょっと変態的な処理。わざわざこんなだるい処理にしなくてもいいだろとは思いますが、まぁこんな書き方もあるのだと知っていただければ幸いです。

6.クラス化 × 関数化

$fizzbuzz = new FizzBuzz();
$fizzbuzz->execFizzBuzz(100, 'Fizz', 'Buzz', 'FizzBuzz');
class FizzBuzz
{
public function execFizzBuzz($loopCount, $strFizz, $strBuzz, $strFizzBuzz)
{
foreach(range(1,$loopCount) as $i){
if($this->divideByFifteen($i)){
echo $strFizzBuzz;
}elseif($this->divideByFive($i)){
echo $strBuzz;
}elseif($this->divideByThree($i)){
echo $strFizz;
}else{
echo $i;
}
echo "<br>";
}
}
// 3で割る
private function divideByThree($i)
{
return ($i % 3 === 0) ? true : false ;
}
// 5で割る
private function divideByFive($i)
{
return ($i % 5 == 0) ? true : false ;
}
// 15で割る
private function DivideByFifteen($i)
{
return ($i % 15 === 0) ? true : false ;
}
}

プログラミングの勉強を進めていくとわかるのですが、プログラムはほとんどが「クラス」で書かれています。
始めて見ると「なんだこれ?」ってなりますが、慣れてくるとこっちのほうが可読性が上がります。

こっちのほうが「プログラム!」って感じがしてかっこいいと思うのはてぃーぽだけでしょうか?

7.クラス化 × 関数化 × 共通化

$fizzbuzz = new FizzBuzz();
$fizzbuzz->execFizzBuzz(100, 'Fizz', 'Buzz', 'FizzBuzz');
class FizzBuzz
{
public function execFizzBuzz($loopCount, $strFizz, $strBuzz, $strFizzBuzz)
{
foreach(range(1,$loopCount) as $i){
if($this->divideNum($i, 15)){
echo $strFizzBuzz;
}elseif($this->divideNum($i, 5)){
echo $strBuzz;
}elseif($this->divideNum($i, 3)){
echo $strFizz;
}else{
echo $i;
}
echo "<br>";
}
}
// 引数1を引数2で割る
private function divideNum($i, $divideNum){
return ($i % $divideNum === 0) ? true : false ;
}
}

 

プログラムはいかに「簡易的」で「読みやすい」かが重要です。

6のサンプルよりも断然スッキリしてませんか?

少しでも「簡単に読める」ことを意識してプログラムしてみてください。