PHPにはmatch式、switch文といった大量のifやelseを省略するための記法があります。これはよく次の様にある変数がある値であるか否かによって分岐を決めます。
$animal = 'dog';
switch ($animal) {
case 'dog':
echo "犬です";
break;
case 'cat':
echo "猫です";
break;
default:
echo "犬でも猫でもないです";
}
echo match ($animal) {
'dog' => "犬です",
'cat' => "猫です",
default => "犬でも猫でもないです",
};
この様に使うのがよくある方法です。この値を元に分岐させるのが読みやすくていい形なのですが実は式も使えます。これは例えば次の様にできます。
<?php
$animal = 'super dog';
switch (true) {
// もしこの条件式が true ならば、if(true == true) となり、
// このcaseが実行される
case str_contains($animal, 'dog'):
echo "犬です";
break;
// もしこの条件式が false ならば、if(true == false) となり、
// このcaseは実行されない
case str_contains($animal, 'cat'):
echo "猫です";
break;
default:
echo "犬でも猫でもないです";
}
echo match (true) {
str_contains($animal, 'dog') => "犬です",
str_contains($animal, 'cat') => "猫です",
default => "犬でも猫でもないです",
};
true と条件式の結果が一致するかしないかという書き方をすることによって条件式の結果が true ならばその分岐に入る、というコードを書けます。挙動をわかっていないと思わずぎょっとする書き方であり、あまり見ない書き方でもあるので積極的に使うことはお勧めできませんが、こういうこともできるという小ネタです。
これを利用すると次の様に FIzzBuzz が簡単に書けます。このコードはPHP公式ドキュメントのmatch式のページから引用しています。
<?php
function fizzbuzz($num) {
print match (0) {
$num % 15 => "FizzBuzz" . PHP_EOL,
$num % 3 => "Fizz" . PHP_EOL,
$num % 5 => "Buzz" . PHP_EOL,
default => $num . PHP_EOL,
};
}
for ($i = 0; $i <=100; $i++)
{
fizzbuzz($i);
}