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を学んで未経験からWebエンジニアを目指す方法とは

実際に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を使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。

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