Search

検索したいワードを入力してください

2019年04月10日

Laravelの便利なcollectionメソッドのまとめ

この記事では、Laravelのコレクションの使い方について、サンプルコードを使いながら、詳しく解説しています。最近、話題のコレクションを使って配列を操作すると、面倒な処理がとてもスッキリしますよ。ぜひ参考にしてしてみてください。

Laravelとは

Laravelとは、近年、最も注目度が高いPHP用フレームワークです。

PHP用のフレームワークは大変多く存在していますが、その中でもLaravelは比較的新しいフレームワークです。そのため、モダンなWebアプリケーション開発やWebサイトの構築に向いています。

他のフレームワークの良いところや最新の技術をうまく取り入れていますので、全体的にバランスの良い、とても優秀なフレームワークです。

フレームワークが使われる理由とは

フレームワークとは、Webアプリケーションを開発するために必要な機能を集めた、Webアプリケーションの骨格のようなものです。Webアプリケーションをゼロから開発していては、大変効率が悪いため、近年では、フレームワークを利用した開発がとても一般的になってきました。

今回、ご紹介するLaravelのコレクションもフレームワークの機能のひとつになります。

Laravelのコレクションで配列(リスト)を操作してみよう

配列やリストの操作はプログラミングの基本のひとつです。Laravelには「コレクション(Collection)」と呼ばれる、配列やリストを操作するための便利な機能が用意されています。

ここでは、Laravelのコレクションの使い方について、サンプルコードも使いながら詳しく解説していきます。

コレクションを使わない配列の操作は処理が面倒

配列(リスト)を操作する場合、通常なら配列(リスト)の件数分、ループ処理を行い、1件づつ値を比較したり変更しながら、長い処理を行う必要があります。Laravelのコレクションを使うと、複雑になりがちな配列(リスト)の操作をスッキリさせることができ、読みやすいこコードになります。

Laravelのコレクションの基本的な書き方

Laravelのコレクションの書き方について、見ていきます。

1.コレクションを取得する

まずは関数「collect」に配列(リスト)を渡してコレクションを取得します。

コレクション = collect(リスト);

2.配列(リスト)を操作する

コレクションには配列(リスト)を操作するためのメソッドが多数用意されているので、次々と配列(リスト)を操作するためのメソッドを呼び出していくことができます。

コレクション = コレクション->リスト操作メソッド();
コレクション = コレクション->リスト操作メソッド()->リスト操作メソッド()・・・;

3.配列(リスト)を取り出す

最後にtoArray()メソッドを呼び出すと、コレクションによって加工されたリスト(配列)を取り出すことができます。

操作後の配列(リスト )= コレクション->toArray();

Laravelのコレクションの便利な使い方

「groupBy」で同じ値のデータをグループ化してみよう

以下の商品リストを例に挙げます。
【例】
1.衣類 Tシャツ
2.食品 カップラーメン
3.食品 ポテトチップス
4.雑貨 コーヒーカップ
5.衣類 ズボン

5件の商品リストはすべて別々の商品ですが、商品のカテゴリは、衣類、食品、雑貨のうちのいずれかです。このリストを商品のカテゴリ(衣類、食品、雑貨)別に分類したい場合、どうすればよいでしょうか?

5件のリストをループしながら、1件づつ商品のカテゴリを取得し、カテゴリ毎にリストを作りなおす必要があります。

同じグループで配列(リスト)をまとめたい場合、Laravelの「groupBy」を使うと処理がスッキリします。

サンプルコード


$list =[
['カテゴリ' => '衣類' , '商品' => 'Tシャツ'],
['カテゴリ' => '食品' , '商品' => 'カップラーメン'],
['カテゴリ' => '食品' , '商品' => 'ポテトチップス'],
['カテゴリ' => '雑貨' , '商品' => 'コーヒーカップ'],
['カテゴリ' => '衣類' , '商品' => 'ズボン'],
];

$collection = collect($list)->groupBy('カテゴリ')->toArray();
var_export($collection);

実行結果

[
'衣類' =>
[ 0 => ['カテゴリ' => '衣類', '商品' => 'Tシャツ' ],
1 => ['カテゴリ' => '衣類', '商品' => 'ズボン' ],
],
'食品' =>
[ 0 => ['カテゴリ' => '食品', '商品' => 'カップラーメン' ],
1 => ['カテゴリ' => '食品', '商品' => 'ポテトチップス' ],
],
'雑貨' =>
[ 0 => ['カテゴリ' => '雑貨', '商品' => 'コーヒーカップ' ],
],
]

たった1行の操作だけで、商品をカテゴリ(衣類、食品、雑貨)別に分類することができました。

「map」で配列(リスト)の値を色々編集してみよう

以下の商品リストを例に挙げます。
【例】
1.Tシャツ T-001
2.Tシャツ T-002
3.ズボン  Z-001

商品名だけでは、同じ商品があるので、Tシャツ(T-001)のように、リストの中身を編集したい場合があります。単にリストをループしながら値を1件づつ修正していってもよいのですが、Laravelの「map」を使うと読みやすいスッキリとしたコードになります。

サンプルコード
$list = [
['商品' => 'Tシャツ' , '型番' => 'T-001'],
['商品' => 'Tシャツ' , '型番' => 'T-002'],
['商品' => 'ズボン' , '型番' => 'Z-001']
];

$collection = collect($list)->map(function($item) {
$newitem['商品'] = $item['商品'] . "(" . $item['型番'] . ")";
return $newitem;
});
var_export($collection->toArray());

実行結果
[
0 => ['商品' => 'Tシャツ(T-001)'],
1 => ['商品' => 'Tシャツ(T-002)'],
2 => ['商品' => 'ズボン(Z-001)'],
]

mapを呼び出すとコールバックでリストの1行分データ($item)が取得できます。サンプルコードでは、商品の後ろにカッコで型番を付加しました。最後に加工した1行分データ($item)を戻すだけで、簡単にリストの中身を編集することができます。

「chunk」で配列(リスト)を分割してみよう

リストの件数が多い場合、1行づつ処理をしていくと、効率が悪くなったり、処理が遅くなったりすることがあります。例えば、大量のデータを登録する場合、1件づつデータの登録処理を行うより100件くらいにまとめて登録したほうが、高速に処理できる場合があります。

配列(リスト)をある程度の件数に分けて処理したい場合は、Laravelの「chunk」を使うと便利です。

サンプルコード
$list = [
['No' => '1', 'データ' => 'aaaaa'],
['No' => '2', 'データ' => 'bbbbb'],
['No' => '3', 'データ' => 'ccccc'],
['No' => '4', 'データ' => 'ddddd'],
['No' => '5', 'データ' => 'eeeee']
];

$collection = collect($list)->chunk(2);
var_export($collection->toArray());

実行結果
[
0 => [
0 => ['No' => '1', 'データ' => 'aaaaa',],
1 => ['No' => '2', 'データ' => 'bbbbb',]
],
1 => [
2 => ['No' => '3','データ' => 'ccccc',],
3 => ['No' => '4','データ' => 'ddddd',]
],
2 => [
4 => ['No' => '5','データ' => 'eeeee',]
],
]

サンプルコードではリストのデータを2件づつに分割しました。最後に残りの件数が2件に満たない場合は、残りのデータだけに分割されます。

「sortBy」で配列(リスト)を並び替えてみよう

リストの順番がバラバラな場合、指定の項目で並び替えたい場合があります。並び替えを自分で処理すると大変面倒な処理になってしまいます。

リストの並び替えは、Laravelの「sortBy」を使った方が簡単です。

サンプルコード
$list = [
['部署' => 'システム部', 'ユーザ' => '山田' , "社員番号" => "0060" ],
['部署' => 'システム部', 'ユーザ' => '田中' , "社員番号" => "0120" ] ,
['部署' => 'サポート部', 'ユーザ' => '加藤' , "社員番号" => "0004" ],
];

$collection = collect($list)->sortBy("社員番号");

var_export($collection->toArray());

実行結果
[
2 => ['部署' => 'サポート部', 'ユーザ' => '加藤', '社員番号' => '0004' ],
0 => ['部署' => 'システム部', 'ユーザ' => '山田', '社員番号' => '0060' ],
1 => ['部署' => 'システム部', 'ユーザ' => '田中', '社員番号' => '0120' ],
]

サンプルコードでは、社員番号の昇順に並び替えました。降順に並び替えたい場合、「sortByDesc」を使います。

並び替えのルールにはコールバック関数も使えます。コールバック関数を使えば、自分で自由に並び替えのルールを作成することができます。

サンプルコード
$collection = collect($list)->sortBy(function($item , $key ){

return $item["社員番号"];
});

実行結果
[
2 => ['部署' => 'サポート部', 'ユーザ' => '加藤', '社員番号' => '0004' ],
0 => ['部署' => 'システム部', 'ユーザ' => '山田', '社員番号' => '0060' ],
1 => ['部署' => 'システム部', 'ユーザ' => '田中', '社員番号' => '0120' ],
]

サンプルコードでは、コールバック関数を使って、社員番号の昇順に並び替えました。

「filter」で必要なデータだけを取り出してみよう

配列(リスト)の件数が多い場合、ある条件に該当するデータだけを取得したい場合があります。例えば、ユーザ情報のリストの中から年齢や性別を条件にしてデータを取得したいケースです。

条件に該当するデータだけを取り出したい場合、Laravelの「filter」を使うと、とても便利です。

サンプルコード

$list =[
['ユーザ' => '山田' , "年齢" => 25 , "性別" => "女性" ],
['ユーザ' => '田中' , "年齢" => 35 , "性別" => "男性" ],
['ユーザ' => '加藤' , "年齢" => 45 , "性別" => "男性" ],
];

$collection = collect($list)->filter(function ($item, $key) {

return $item["年齢"] < 35;
});

var_export($collection->toArray());

実行結果

[
0 => ['ユーザ' => '山田' , "年齢" => 25 , "性別" => "女性" ],
]

サンプルコードでは、配列の中から、年齢が35歳未満のデータのみを取得しました。

簡単なフィルターなら「where」も便利です

単純に項目名と値に該当するデータを取り出したいだけなら、「filter」よりも「where」を使ったほうが簡単です。

サンプルコード

$list =[
['ユーザ' => '山田' , "年齢" => 25 , "性別" => "女性" ],
['ユーザ' => '田中' , "年齢" => 35 , "性別" => "男性" ],
['ユーザ' => '加藤' , "年齢" => 45 , "性別" => "男性" ],
];

$collection = collect($list)->where("性別" , ”女性”);

var_export($collection->toArray());

実行結果

[
0 => ['ユーザ' => '山田' , "年齢" => 25 , "性別" => "女性" ],
]

サンプルコードでは、配列の中から、性別が女性のデータのみを取得しました。

「dd」で配列(リスト)の中身を確認してみよう

コレクションクラスを使って、リストの操作を繰り返していくと現在のリストの中身がどういう状態なのかを知りたい場合があります。Laravelの「dd」を使うとリストの中身を画面に出力させることができます。

リスト

$list =[
['商品' => 'Tシャツ' , '型番' => 'T-001'],
['商品' => 'Tシャツ' , '型番' => 'T-002'],
['商品' => 'ズボン' , '型番' => 'Z-001']
];

$collection = collect($list)->groupBy("商品");

//リストの結果を表示
//$collection-> dd();

サンプルコードでは、商品でグループ化した配列の結果が画面に表示されます。Laravelの「dd」は、グラフィカルでとても見やすく出力してくれるので、リストの中身がわかりやすいです。

「plunk」で必要な項目の値だけを取り出してみよう

リストの中から、ユーザ名だけをリストとして取り出したい場合、どうすればいいでしょうか?指定のキーだけを取り出したい場合、Laravelの「pluck」を使うと、簡単に特定の項目だけのリストが作れます。

サンプルコード

$list =[
['部署' => 'システム部', 'ユーザ' => '山田' , "年齢" => 25 ],
['部署' => 'システム部', 'ユーザ' => '田中' , "年齢" => 35 ],
['部署' => 'サポート部', 'ユーザ' => '加藤' , "年齢" => 45 ],
];

//ユーザの値だけを取り出す
$collection = collect($list)->pluck('ユーザ');

var_export($collection->toArray());


実行結果
[
0 => '山田',
1 => '田中',
2 => '加藤',
]

サンプルコードでは、ユーザの値だけを取り出すことができました。

自分で独自のメソッドを作ってみよう

Laravelのコレクションには色々なメソッドが用意されていますが、操作したいメソッドが見つからない場合、自分で独自のメソッドを作ることができます。

ここでは、独自のメソッドの作成方法を見ていきます。

サンプルコード

//独自メソッドの定義
Collection::macro('substr3', function () {

//先頭3文字分を取得する
$collection = $this->map(function ($value) {
return substr($value , 0 ,3);
});

return $collection;
});



サンプルコードでは、先頭3文字だけ取得する独自のメソッドを「substr3」という名前でコレクションに定義しました。

実際に呼び出してみます。

サンプルコード
$list =[ "abcd" , "XYZ" , "AAA123" , "" ];

//独自メソッドを呼び出す
$collection = collect($list)->substr3();

var_export($collection->toArray());

実行結果

[
0 => 'abc',
1 => 'XYZ',
2 => 'AAA',
3 => '',
]

メソッドは、好きな名前で定義することができるので、色々な場面で利用することができます。

Laravelのコレクションを使って、配列の操作をスッキリさせよう。

いかがだったでしょうか?

自分で配列(リスト)のループ処理をするよりも、Laravelのコレクションを使ったほうが、処理をスッキリとさせることができます。

Laravelには、今回、ご紹介したコレクションの使い方以外にも、便利な使い方が多数あります。Laravelの公式サイトも参考にしてみてください。

この記事を参考にして、コレクションを使った配列の操作を試してみてはいかがでしょうか。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related