⚠️: 海外の記事をchatGPTで要約しただけのもの、主に自分用
概要
Laravel のコレクションにおける Higher-order messaging(高階メッセージング) とは、明示的なループやコールバックを使わずに、各要素のメソッドを呼び出したり、プロパティにアクセスできる仕組み です。
これにより、コードがシンプルで読みやすくなります。例えば、map
、filter
、each
、sum
、sortBy
などのメソッドで使用でき、直感的かつ効率的なデータ操作が可能になります。
サンプル
<?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]
元記事