Open3

PHP オレオレ Tips 集

ふわせぐふわせぐ

いつかまとめて GitHub に上げる予定(関心が広すぎてライブラリ化するかはわからない)

ふわせぐふわせぐ

年(yyyy)から,その一年間の年月(yyyymm)の配列を生成する

c 言語チック.$yyyyint で受け取れる場合便利

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 に直接実装しても良い.