PHP(とちょっとLaravel)の細々とした覚書

..

foreachで値を直接いじくりたいとき

foreach ($data_array as &$data) {
  $data['中身']['値'] = true;
}

繰り返し処理のあとの$data_arrayを変更された状態にしたい場合は、値の変数に&をつける。

値から配列のキーを取りたいとき

array_search(, 配列);

定数クラス内の配列('定数が表すもの'=>定数)からマジックナンバーを取り出したい時によく使ってます。

array_search($const, CONST_CLASS::CONST_LIST);

配列から任意の値を削除して、別の配列を作りたいとき

こちらを参照しました。PHPで配列から特定の要素を削除する

array_values(array_diff(配列, 第一引数から削除する値の配列);

配列同士を比較するarray_diffの戻り値(値だけ消えてキーはそのまま)をarray_valuesで整える。

リクエストで変更するカラムの配列を受け取り、その中から変更レコードのものを除外した配列を作ってwhereInに渡す、みたいな処理で使ってます。

一定期間の中でランダムな日付を作りたい時

こちらを参照しました。特定の2つの日付の間から、ランダムに1日を取得

HogeFactory.php
        $start = Carbon::create('2021', '1', '1');
        $end = Carbon::create('2021', '12', '31');
        $min = strtotime($start);
        $max = strtotime($end);
        $date = rand($min, $max);

        return [
            'なんらかの日付' => date('Y-m-d', $date),
        ];

Factoryでテストデータの日付を適当に作る際、この方法で1年の内どこかしらの日付を取ってくるようにしました。

空のコレクションはifでfalseにはならない

なぜなら配列ではなく、Collectionクラスのインスタンスだから…
中身があろうとなかろうと…

中身の有無で処理を変えたいときは($collection->isEmpty())で真偽値を返してもらうとよい。

定数は定数クラスを作るのが楽

こちらを参照しました。Laravelで定数を使うときにConfigを使う腰抜けはもう死んだ

config定数.phpを作って配列をリターンするやり方はどうも不便でなりません。
デメリットは参考記事にも書いてありますし、個人的にはVSCodeで表示したとき一面まっかっかになってしまうのが見づらくてしょうがないです。

クラスで管理するメリットとしては、個人的にはテストコードで簡単に使えるという点に尽きると思います。
前職では定数はconfigで定義し、テストコード内の定数はすべてマジックナンバーで書いてましたので、変更がある度に地獄でした。
「0」だの「301(なんらかの独自ステータスコード)」だの、検索かけて書き換えようにもテストがデグらないか不安で不安で…見てるうちになんの数字だかわかんなくなってくるし。

というわけで定数クラス推しです。

PHP8.1ではfinal public const修飾子をつけることで、クラス定数を上書きさせないことが可能になりました。安心ですね。