📚

【Laravel】Collection の Higher-order Messaging を使いこなす:ループレスで読みやすいデータ操作入門

2025/02/14に公開

⚠️: 海外の記事をchatGPTで要約しただけのもの、主に自分用

概要

Laravel のコレクションにおける Higher-order messaging(高階メッセージング) とは、明示的なループやコールバックを使わずに、各要素のメソッドを呼び出したり、プロパティにアクセスできる仕組み です。

これにより、コードがシンプルで読みやすくなります。例えば、mapfiltereachsumsortBy などのメソッドで使用でき、直感的かつ効率的なデータ操作が可能になります。

サンプル

<?php

use Illuminate\Support\Collection;

$users = collect([
    (object) ['name' => 'Alice', 'age' => 25, 'votes' => 5, 'active' => true],
    (object) ['name' => 'Bob', 'age' => 30, 'votes' => 10, 'active' => false],
    (object) ['name' => 'Charlie', 'age' => 35, 'votes' => 15, 'active' => true],
]);

// 指定したプロパティの平均値を取得
$users->average->age; // 出力: 30
$users->avg->votes;   // 出力: 10

// 条件を満たす要素が存在するかチェック
$users->contains->name === 'Alice'; // 出力: true

// コレクション内の各要素にメソッドを実行
$users->each->activate(); // 直接の出力なし (各ユーザーを有効化)

// すべての要素が条件を満たすかチェック
$users->every->active; // 出力: false

// 指定したプロパティの条件を満たす要素のみを抽出
$users->filter->active; // 出力: [Alice, Charlie]

// 条件を満たす最初の要素を取得
$users->first->active; // 出力: Alice

// ネストした配列を平坦化して単一のコレクションにする
$nested = collect([
    (object) ['tags' => ['php', 'laravel']],
    (object) ['tags' => ['javascript', 'vue']]
]);
$nested->flatMap->tags; // 出力: ['php', 'laravel', 'javascript', 'vue']

// 指定したプロパティごとにグループ化
$users->groupBy->active; // 出力: [true => [Alice, Charlie], false => [Bob]]

// 指定したプロパティをキーとして連想配列を作成
$users->keyBy->name; // 出力: ['Alice' => Alice, 'Bob' => Bob, 'Charlie' => Charlie]

// コレクション内の各要素を変換して新しいコレクションを作成
$users->map->name; // 出力: ['Alice', 'Bob', 'Charlie']

// 指定したプロパティの最大値を取得
$users->max->age; // 出力: 35

// 指定したプロパティの最小値を取得
$users->min->age; // 出力: 25

// 条件に基づいてコレクションを二分割
$users->partition->active; // 出力: [active => [Alice, Charlie], inactive => [Bob]]

// 条件に一致する要素を削除
$users->reject->active; // 出力: [Bob]

// 条件を満たすまでの要素をスキップ
$users->skipUntil->active; // 出力: [Bob]

// 条件を満たしている間はスキップ
$users->skipWhile->active; // 出力: [Bob]

// 少なくとも1つの要素が条件を満たすかチェック
$users->some->active; // 出力: true

// 指定したプロパティで昇順ソート
$users->sortBy->age; // 出力: [Alice, Bob, Charlie]

// 指定したプロパティで降順ソート
$users->sortByDesc->age; // 出力: [Charlie, Bob, Alice]

// 指定したプロパティの合計値を取得
$users->sum->votes; // 出力: 30

// 条件を満たすまで要素を取得
$users->takeUntil->active; // 出力: [Bob]

// 条件を満たしている間の要素を取得
$users->takeWhile->active; // 出力: [Alice]

// 指定したプロパティの重複を排除
$users->unique->age; // 出力: [25, 30, 35]

元記事

https://x.com/Akr4mKhan/status/1889675836908794263

Discussion