昨日のPHPでFizzBuzzの解説
「PHPでFizzBuzzを書いてみました」について、以下のようなツイートがありました。
「最短の FizzBuzz」のコードにある echo 文はどういう意味なのか分からない。検索しようにも調べ方が思いつかない…。/ PHPでFizzBuzzを書いてみました — A Day in Serenity (Reloaded) http://t.co/k5x9qXomAZ
— suno (すの) (@suno88) April 16, 2015
個人的には、まだリーダブルなコードだと思っていましたが、少々トリッキーなコードであることは否めません。
確かに、検索しづらいので、一応、解説を書いておくことにします。
ちなみに、「PHP FizzBuzz」でぐぐると、以下のコードが出てきましたが、正直読めませんでした(w
最短のFizzBuzz
<?while($i++<100)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,"
";
上記のコードですが、これをPHP 5.3でも動くように、そして、読みやすく書けば、以下のようになります。
<?php
$a1 = array(Fizz);
$a2 = array(Buzz);
while ($i++<100) {
echo $a1[$i%3] . $a2[$i%5] ?: $i, "
";
}
ここで配列の要素Fizz
とBuzz
は未定義の定数です。未定義の定数があるとPHPでは以下のNoticeが発生します。
Notice: Use of undefined constant Fizz - assumed 'Fizz'
そこに表示されていますが、結局、文字列として解釈されます。
$i%3
は$i
を3で割った余りなので、0の場合のみ配列の要素が存在し、文字列が表示されます。
要素が存在しない場合は、以下のようなNoticeが発生します。
Notice: Undefined index: 1
そして、もともとのコードの
[Fizz][$i%3]
は、PHP 5.4で導入された配列の短縮構文([]
)と、PHP 5.5で導入された配列リテラルのデリファレンスです。
配列を書いてそのままその要素にアクセスしています。
Date: 2015/04/17