昨日のPHPでFizzBuzzの解説

PHPでFizzBuzzを書いてみました」について、以下のようなツイートがありました。

個人的には、まだリーダブルなコードだと思っていましたが、少々トリッキーなコードであることは否めません。

確かに、検索しづらいので、一応、解説を書いておくことにします。

ちなみに、「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, "
";
}

ここで配列の要素FizzBuzzは未定義の定数です。未定義の定数があると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

Tags: php