Laravelでcollection(コレクション)を使う方法【初心者向け】

初心者向けにLaravelでcollection(コレクション)を使う方法について解説しています。collectionは配列に新しい機能を付け加えたもので、覚えておくと処理が便利になります。実際に書きながら理解しましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Laravelでcollectionを使う方法について解説します。

配列を操作しやすくする機能が多くあるので、使い方を知っておくと非常に便利でしょう。

 

なお本記事は、TechAcademyのPHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

今回は、Laravelに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Laravelでcollectionを使う方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

Laravelのcollectionとは

Laravelのcollectionとは配列のラッパーです。Illuminate\Support\Collection にて提供されています。

collectionにはPHPの配列を操作しやすくした、様々なメソッドが定義されています。each、map、filter、reduce、などほかの言語で馴染み深い配列操作メソッド、union、intersect、diff などの集合操作系メソッドも使えたりします。

またコレクション内から要素を取り出す操作も充実しており get、shift、put、push、pull など行えます。

そのほかいっぱいあるのでぜひリファレンスを参照してください。
Laravelリファレンス-collections

コレクションを使う事でメソッドチェーンが使えるようになるのが非常にありがたいです。クロージャーによりループ変数のスコープが閉じるのでコードがスッキリすると思います。

 

collectionの書き方

collectionを作成するにはヘルパー関数collectを使います。引数として配列を渡す事で、配列をラップした Illuminate\Support\Collection が生成されます。これを使って色々遊んでみましょう。

$c = collect([1, 2, 3, 4, 5])
$c->partition(function($i) { return $i % 2 === 0; }) // 偶数奇数のコレクションに分割する
$c->filter(function ($i) { return $i >= 3; }) // 3以上の要素のみを取得
$c->map(function ($i) { return $i ** 2; }) // 各要素を二乗する

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

実際にLaravelのcollectionを使ってみよう

FizzBuzz でもやってみましょう。1から100 までの数字に対してFizzBuzzのルールに基づいた変換を行い、最終的な結果を文字列としてまとめて表示してみましょう。以下が変換ルールです。

  • 3の倍数はFizzに変換
  • 5の倍数はBuzzに変換
  • 3と5の倍数であっても15の倍数であればFizzBuzzに変換
  • その他の場合は変換しない

詳しいルールは次のリンクを参考にしてください。
wikipedia-fizz_buzz

rangeメソッドを使うとある範囲の値を含んだ配列が作成できます、これをcollectionに変換するところから始めましょう

collect(
  range(1, 100)
)

次に map を呼び出し、各数字に対してFizzBuzzを判定します。

...
)->map(function ($n) {
    if ($n % 15 === 0) return 'FizzBuzz';
    if ($n % 3 === 0) return 'Fizz';
    if ($n % 5 === 0) return 'Buzz';
    return $n;
  })

最後にこのcollectionを文字列としてreduceでまとめます。

...
})->reduce(function ($p, $n) {
    return ""${p}\n${n}"";
  }, ""Result:\n""); // 最終的な結果を文字列としてまとめます

以上まとめると以下のようになります。

$result = collect(range(1, 100))-> // range メソッドを使って [0, .., 100] の配列を作成、collection に変換します
  map(function ($n) {
    if ($n % 15 === 0) return 'FizzBuzz';
    if ($n % 3 === 0) return 'Fizz';
    if ($n % 5 === 0) return 'Buzz';
    return $n;
  })-> // 配列の各数字に対して FizzBuzz のルールに基づいた変換を行います
  reduce(function ($p, $n) {
    return ""${p}\n${n}"";
  }, ""Result:\n""); // 最終的な結果を文字列としてまとめます
echo $result;

ここで使ったmapはとても便利なメソッドなので使い方に慣れておくといいと思います。

mapはクロージャーを引数に取りcollectionインスタンスを返すメソッドです (つまりメソッドチェーンが可能です)。以下がイメージです。

collect(…)->map(function ($value, $index) { … })->…

クロージャーの$valueにはcollectionの中身が順番に入ってきます。

第二引数として $index (ループインデックス) を受け取ることもできます。クロージャーは値を返す必要があり、その値のcollectionが作成されます。つまりクロージャーとして数値 ->文字列の変換を行う関数を渡せば、mapは数値のcollection->文字列のcollectionの変換をしてくれるものだと言えるでしょう。

いかがだったでしょうかcollectionは配列操作を楽にしてくれます、積極的に使っていきたいですね。メソッドチェーンは便利です!限度はありますが!

この記事を監修してくれた方

鵜澤峻平(うさわしゅんぺい)

普現在はフリーランスのエンジニアをしていてプログラミング歴は5年目になります。普段はRails、Laravel、Node.js等を使ってWeb、モバイルアプリケーションを作成しています。開発実績としては、いくつかのWeb サービス、コンシューマー向けモバイルアプリケーション、NPOサイトリニューアル、ロボット用プログラムなどがあります。

TechAcademyでメンターをはじめたのは、「プログラミングでやりたいことがある人を応援したい」、「講師と受講者が話し合って学び方を決めていく」に惹かれたからです。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

オンラインのプログラミングスクールTechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

PHPやフレームワークのLaravelを使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。