icon
icon

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

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

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

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

 

そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプPHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

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

大石ゆかり

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

田島悠介

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

大石ゆかり

お願いします!

 

Laravelのcollectionとは

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

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

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

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

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

 

collectionの書き方

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

$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に変換
  • その他の場合は変換しない
1時間でできる無料体験!

詳しいルールは次のリンクを参考にしてください。
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を使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する