Open3
PHP オレオレ Tips 集
いつかまとめて GitHub に上げる予定(関心が広すぎてライブラリ化するかはわからない)
年(yyyy)から,その一年間の年月(yyyymm)の配列を生成する
c 言語チック.$yyyy
を int
で受け取れる場合便利
public function createYearMonthsFromYear(int $year): array
{
return array_map(function (int $value) use ($year) {
return $year * 100 + $value;
}, range(1, 12));
}
使用例
$year = 2021;
$yyyymms = createYearMonthsFromYear($year);
// [202101, 202102, 202103, 202104, 202105, 202106, 202107, 202108, 202109, 202110`, 202111, 202112, ]
PHP8.1 の Enum で,description()
とか label()
は実装しがちなメソッドである.
例えば以下.
<?php
declare(strict_types=1);
enum Gender: string
{
case MAN = 'man';
case WOMAN = 'woman';
public function label(): string
{
return match ($this) {
self::MAN => '男',
self::WOMAN => '女',
};
}
}
ここで,labels(): array
が欲しくなったとする.
配列の key に Enum の value, value に label()
をセットしたいとき,以下のように実装することができる.
<?php
declare(strict_types=1);
trait HasLabel
{
abstract function label(): string;
/**
* @return array<int|string, string>
*/
public static function labels(): array
{
return array_combine(
array_column(self::cases(), 'value'),
array_map(fn (self $e) => $e->label(), self::cases()),
);
}
}
<?php
declare(strict_types=1);
enum Gender: string implements HasLabel
{
use HasLabel;
case MAN = 'man';
case WOMAN = 'woman';
public function label(): string
{
return match ($this) {
self::MAN => '男',
self::WOMAN => '女',
};
}
}
var_dump(Gender::labels());
の結果は以下
array(2) {
["man"]=>
string(3) "男"
["woman"]=>
string(3) "女"
}
もちろんトレイトに切り出さず,Enum に直接実装しても良い.