【Laravel】コレクション配列とは?使い方とメリットを解説!

この記事からわかること

  • Laravelコレクションとは?
  • 配列操作できる?
  • 使い方作成方法メリット

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

LaravelのEloquent(エロクアント)を学習中、「コレクション(collection)」というのが出てきたので自分なりにまとめてみました。

コレクション(collection)とは?

コレクションはLaravel独自の形式で配列を操作する機能が拡張されたラッパークラスです。

使い方は簡単で配列をコレクション形式に変換後、定義されているメソットを呼び出すことで様々な操作や機能を簡単に実装することができます。

コレクションの実態はオブジェクト(コレクションインスタンス)でその中に配列本体が格納されています。

$collection = collect([1, 2, 3]);
var_dump($collection);
// 結果:object(Illuminate\Support\Collection)#279 (2) { ["items":protected]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["escapeWhenCastingToString":protected]=> bool(false) }

またEloquent(エロクアント)の返り値は自動的にコレクション配列に変換されます。名前空間は違いますが操作できることに違いはありません。

$records = User::all();
var_dump($records);
// 結果:object(Illuminate\Database\Eloquent\Collection)#327 (2) { ["items":protected]=> array(42) { [0]=> object(App\Models\..... 

コレクション配列の作成方法

コレクション配列を作成(変換)するには、配列に対してcollectメソッド(ヘルパ)を使用します。

$collection = collect([1, 2, 3]);

collectメソッドは返り値としてコレクションインスタンスを返すので変数で受け取ります。

var_dump($collection);
// 結果:object(Illuminate\Support\Collection)#279 (2) { ["items":protected]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["escapeWhenCastingToString":protected]=> bool(false) }

このコレクションインスタンスのメソッドをメソッドチェーン形式で呼び出すことで配列を操作することが可能になります。またメソッドチェーンで扱うので返り値に更新されたコレクションインスタンスが常に渡るため、元の配列の形は保持されたままであることもメリットの1つです。

豊富なメソッドや操作できること

コレクションインスタンスを受け取ったら定義済みの沢山あるメソッドで様々な操作が可能になります。

参照記事:公式:コレクション

メソッドとできること

中でもよく使うメソッドの使い方

allメソッド

コレクションを解除して配列として返します。

$collection = collect([1, 2, 3, 4]);
var_dump($collection);
// object(Illuminate\Support\Collection)#279 (2) { ["items":protected]=> array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } ["escapeWhenCastingToString":protected]=> bool(false) }
var_dump($collection->all());
// array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }

countメソッド

コレクションの個数をカウントできるメソッドです。返り値に個数が渡ります。

$collection = collect([1, 2, 3, 4]);
echo $collection->count(); // 4

diffメソッド

2つのコレクションの差分(一致しないもの)をコレクション形式で返します。

$collection = collect([1, 2, 3, 4, 5]);
$diff = $collection->diff([2, 4, 6, 8]);
var_dump($diff->all()); // array(3) { [0]=> int(1) [2]=> int(3) [4]=> int(5) }

eachメソッド

コレクション内の値とキー値をループで取り出すことができます。

$collection = collect([1, 2, 3, 4]);
$collection->each(function ($item, $key) {
    echo $item;  // 1,2,3,4
});

everyメソッド

コレクション内の値とキー値をループで検証し、全要素がルールを満たせばtrue、1つでも満たさなければfalseを返す。

$collection = collect([1, 2, 3, 4]);
if($collection->every(function ($value, $key) {
    return $value > 0;
})){
    echo "true";  // true
}else{
    echo "false";
}

filterメソッド

コレクション内の値とキー値をループで検証し、フィルター条件に満たした値のみのコレクションを返す。

$collection = collect([1, 2, 3, 4]);
$filtered = $collection->filter(function ($value, $key) {
    return $value > 2;
});
var_dump($filtered->all()); // array(2) { [2]=> int(3) [3]=> int(4) }

getメソッド

引数に指定された値のキー値があればその値を、なければnullを返す。第二引数にない場合のデフォルト値を指定可能。

$collection = collect(['name' => 'ame', 'framework' => 'laravel']);
echo $value = $collection->get('framework'); // laravel
echo $value = $collection->get('language'); // null
echo $value = $collection->get('language','php'); // php

hasメソッド

引数に指定された値のキー値があればtrue、なければfalseを返す。引数は複数指定可能。

$collection = collect(['user_id' => 1, 'name' => 'ame','language' => 'php', 'framework' => 'laravel']);
$collection->has('framework'); // true
$collection->has('framework','app'); // false

joinメソッド

引数に指定された値でコレクションの値を結合。第二引数にも指定した場合は最後の値のみ適応。

$collection = collect(['user_id' => 1, 'name' => 'ame', 'language' => 'php', 'framework' => 'laravel']);
var_dump($collection->join('-')); // string(17) "1-ame-php-laravel"
var_dump($collection->join('-',':')); // string(19) "1-ame-php:laravel"

searchメソッド

引数に指定された値を検索し、そのキー値を返す。

$collection = collect(['user_id' => 1, 'name' => 'ame', 'language' => 'php', 'framework' => 'laravel']);
echo $collection->search('php'); // language

まだまだ勉強中ですので至らぬ点や間違っているところがございましたらご指摘いただけると嬉しいです。

ご覧いただきありがとうございました!

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index