LaravelのCollectionの使い方についてまとめています。
Collectionについて、簡単な解説と下記のメソッドを使ってみています。
・all
・add
・push
・put
・where
・filter
・map
・each
・count
・contains
載せているコードについては、Laravelのバージョン10で動作確認しました。
LaravelのCollectionとは?
Laravelの基本機能としてIlluminateSupportCollectionに配置されています。
配列を使いやすくするラッパークラスのようです。
collect
ヘルパーを使うか、Collectionクラスからインスタンス化して使うことができます。
Collectionクラスをnewして使う場合には、Illuminate\Support\Collection
をuseするようにしてください。
Collectionを使うことで、ソートや条件をつけたデータ取得などの配列操作を簡単に行うことができるようになります。
公式のドキュメントはこちらに配置されています。
この記事で紹介しているメソッド以外にも載っているので、一度確認しておくと良いかと思います。
Collectionの使い方
コレクションの基本的な使い方についてです。
Collectionを作成する
このようにして、コレクションを作ることができます。
$collect = collect();
dd($collect);
ddで出力すると、下記のようにコレクションのインスタンスになりました。
Illuminate\Support\Collection {#297 ▼
#items: []
#escapeWhenCastingToString: false
}
配列からCollectionを作成する
配列を初期値として、コレクションを作ることもできます。
$collect = collect(['aaa', 123, true]);
dd($collect);
ddで出力すると、itemsプロパティに配列がセットされています。
Illuminate\Support\Collection {#297 ▼
#items: array:3 [▼
0 => "aaa"
1 => 123
2 => true
]
#escapeWhenCastingToString: false
}
連想配列やクラスからCollectionを作成する
連想配列やクラスを初期値として設定して、コレクションを作ることもできます。
$collect = collect([
'aaa' => 'bbb',
'hoge' => 'fuga',
new Collection(['hoge' => 'fuga'])
]);
dd($collect);
ddで出力してみました。
連想配列とコレクションのインスタンスがitemsプロパティに設定されました。
Illuminate\Support\Collection {#288 ▼
#items: array:3 [▼
"aaa" => "bbb"
"hoge" => "fuga"
0 => Illuminate\Support\Collection {#299 ▼
#items: array:1 [▶]
#escapeWhenCastingToString: false
}
]
#escapeWhenCastingToString: false
}
Collectionの値を取得する
allメソッドを使うと、コレクションの値を全て取得することができます。
$collect = collect(['apple', 777, true]);
dd($collect->all());
ddで出力すると、下記のように配列が取得できました。
array:3 [▼
0 => "apple"
1 => 777
2 => true
]
ひとつだけとりたいときには、getメソッドを使って、要素番号を指定して取ることができます。
連想配列の場合にはキーを指定すると良いです。
$collect = collect(['apple', 777, true]);
dd($collect->get(1)); // 777
ループして全ての値を取得する
配列と同じようにコレクションをもとにループすることができます。
$fruits = collect(['apple', 'grape', 'lemon']);
foreach ($fruits as $fruit) {
echo $fruit . " ";
}
$fruits
コレクションに3つの要素を入れています。
その後に、配列のようにforeachを使ってループしています。
結果を確認すると、下記のように出力されました。
apple grape lemon
最初のデータを取得する
最初の1番目を取得したいときには、firstメソッドが使えます。
値がなかったときには、nullになります。
$collect = collect(['apple', 777, true]);
dd($collect->first()); // apple
最後のデータを取得する
最後のデータを取得するときには、lastメソッドが使えます。
こちらも値がなかったときには、nullになります。
$collect = collect(['apple', 'banana', 'melon', 'orange', 'peach']);
dd($collect->last()); // peach
Collectionの値を追加する
コレクションに値を追加するにはaddメソッドを使うことができます。
$collect = collection();
$collect->add('apple');
$collect->add('banana');
$collect->add('lemon');
dd($collect->all());
$collect
インスタンスを作って、addメソッドで渡したい要素を3つ追加しました。
結果、下記のように追加されたことが確認できました。
array:3 [▼
0 => "apple"
1 => "banana"
2 => "lemon"
]
複数の値を追加したい
値を複数、一括で追加したいときにはpushメソッドを使うことができます。
$collect = collect();
$collect->push('apple');
$collect->push('peach', 'grape', 'melon');
$collect->push('lemon');
dd($collect->all());
$collect
インスタンスからpushを呼んで、値を追加しています。
最初にapple
を追加して、その後に「’peach’, ‘grape’, ‘melon’」と、3つをまとめて追加しました。
結果を確認すると、下記のようになりました。
array:5 [▼
0 => "apple"
1 => "peach"
2 => "grape"
3 => "melon"
4 => "lemon"
]
値を上書きしたい
値をコレクションの上書きしたいときには、putメソッドを使うことができます。
$collect = collect(['apple', 'grape', 'melon']);
$collect->put(1, 'banana');
dd($collect->all());
Collectionのインスタンスからputメソッドを呼んで、1番目の要素をbanana
で上書きました。
確認すると、下記のようになりました。
array:3 [▼
0 => "apple"
1 => "banana"
2 => "melon"
]
このようにputメソッドの1番目のキーの値を上書きします。
キーの値がなければ追加されます。(連想配列でも同様に動作します)
Collectionの値を削除する
コレクションからpullメソッドを使うことで、値を削除することができます。
$collect = collect(['apple', 'grape', 'melon']);
$collect->pull(1);
dd($collect->all());
pullメソッドに削除したい、キーを指定しています。
1番目を削除したので、確認してみると、下記のようになりました。
array:2 [▼
0 => "apple"
2 => "melon"
]
Collectionで使いそうなメソッド6選
上記で紹介したメソッド以外にもコレクションを使うときに、よく使いそうなメソッドを6つ紹介しています。
必要なデータを探す(whereメソッド)
whereメソッドを使うと、条件をつけてコレクションから必要なデータを取得できます。
$fruits = collect([
['red' => 'apple'],
['yellow' => 'banana'],
['blue' => 'grape'],
]);
$fruits = $fruits->where('yellow');
dd($fruits->all());
$fruits
コレクションを作っています。
その後にwhereメソッドを呼び出して、取得したい「yellow
」を指定しコレクションを返しました。
結果を確認すると、下記のようにひとつだけ取得できました。
array:1 [▼
1 => array:1 [▼
"yellow" => "banana"
]
]
フィルターをかけたい(filterメソッド)
filterメソッドを使うと、コレクションに入っているデータに対してフィルタリングして、必要な分だけ取り出すことができます。
$fruits = collect([
['red' => 'apple'],
['yellow' => 'banana'],
['blue' => 'grape'],
['white' => 'lychee'],
]);
$filtered = $fruits->filter(function (array $value) {
return isset($value['yellow']) || isset($value['blue']);
});
dd($filtered);
コレクションからfilterメソッドを呼び出しています。
$value
変数にコレクションの要素がひとつずつ入ってきて評価されます。
評価した結果、true
のデータのみ残って、コレクションとして返されます。
出力結果を確認すると、フィルタリングされたコレクションが返ってきました。
Illuminate\Support\Collection {#322 ▼
#items: array:2 [▼
1 => array:1 [▼
"yellow" => "banana"
]
2 => array:1 [▼
"blue" => "grape"
]
]
#escapeWhenCastingToString: false
}
コレクションを加工して返したい(mapメソッド)
mapメソッドを使うことで、コレクションの要素のひとつひとつに対して処理をすることができます。
$fruits = collect(['apple', 'banana', 'grape']);
$mapResult = $fruits->map(function (string $value) {
return $value . "!!!";
});
dd($mapResult->all());
$fruits
コレクションを作成して、その後にmapメソッドを使っています。
それぞれの要素が$value
に設定されて処理されます。
要素にたいして、文字列の「!!!」を結合して返しました。
結果を確認すると、下記のように要素が加工されました。
array:3 [▼
0 => "apple!!!"
1 => "banana!!!"
2 => "grape!!!"
]
コレクションの要素を元にループする(eachメソッド)
eachメソッドを使うと、コレクションの要素をもとにループ処理することができます。
$fruits = collect(['apple', 'banana', 'grape']);
$fruits->each(function (string $value, int $key) {
echo "{$key}:{$value} ";
});
$fruits
コレクションを作成した後にeachメソッドを使っています。
$value
にはコレクションの要素、$key
にはキーが設定されます。
今回はechoで出力してみました。
結果を確認すると、下記のようになります。
0:apple 1:banana 2:grape
コレクションの要素数を取得する(countメソッド)
コレクションの要素数を数えるにはcountメソッドを使います。
$fruits = collect(['apple', 'banana', 'grape']);
dd($fruits->count());
コレクションを3つの要素で作成して、countメソッドで要素数を取得しています。
結果を確認すると、数値の「3」が返ってきました。
コレクションに値を含むか確認する(containsメソッド)
コレクションに値を含んでいるか確認するにはcontainsメソッドを使うと良いです。
$fruits = collect(['apple', 'grape', 'banana']);
dd($fruits->contains('grape')); // true
$fruits
コレクションからcontainsメソッドで「grape」が含まれるか確認しています。
含まれる場合はtrue
が返ってきて、含まない場合にはfalse
になります。
今回は含まれているのでtrue
が返ってきます。
コメント
「$collection->add()する」の部分で、
=================================
$items = new Collection();
$items->add(‘aaaa’);
$items->add(‘bbb’);
$items->add(123);
$items->add(true);
dd($items);
の結果が
=================================
Collection {#209 ▼
#items: array:3 [▼
0 => “aaaa”
1 => array:1 [▼
“hoge” => 123
]
2 => true
]
}
になる意味が理解できませんでした。
“bbb”がありませんし、”hoge”というのはどこから来たのでしょうか?
間違ってますね。
修正しました。ご指摘ありがとうございます🫡