おはようございます、ミノルです。梅雨に入って少しジメッとしてきました。梅雨の雨はジメッとしていて苦手ですが、カラッとした日に降る雨の音は落ち着きがあって好きです。今回は雨のように大量のコレクションでもかたまりにしてまとめられるメソッドを扱います。
現実の雨もかたまりにまとめて必要なところにだけ降って欲しいものですね。
Laravel11公式ドキュメントのCollectionメソッド chunkについてみていきます。段階的に見ていきますが、LaravelのCollectionについて把握していない方は、以下の記事を先に見るとこの記事が読みやすくなると思います。
この記事で得られること
- chunk()の概要
- chunk()の実装コードを見る体験
メソッドの概要を見る
Laravel – The PHP Framework For Web Artisans
公式ドキュメントを日本語訳してからの引用
この**
chunk
**メソッドは、コレクションを指定されたサイズの複数の小さなコレクションに分割します。
$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$chunks = $collection->chunk(4);
$chunks->all();
// [[1, 2, 3, 4], [5, 6, 7]]
- 元のコレクションの指定された位置を区切りに二つに分かれている
このメソッドは、 Bootstrapなどのグリッド システムで作業する場合のビューで特に便利です。たとえば、グリッドに表示したいEloquentモデルのコレクションがあるとします。
@foreach ($products->chunk(3) as $chunk)
<div class="row">
@foreach ($chunk as $product)
<div class="col-xs-4">{{ $product->name }}</div>
@endforeach
</div>
@endforeach
- chunkにより、グリッドに表示するカラムを区分けしている
メソッドのソースを見る
概要は何となく掴めてきたので早速ソースを見ていきます。
vendor/laravel/framework/src/Illuminate/Collections/Collection.php
**/**
* Chunk the collection into chunks of the given size.
*
* @param int $size
* @return static<int, static>
*/
public function chunk($size)
{
if ($size <= 0) {
return new static;
}
$chunks = [];
foreach (array_chunk($this->items, $size, true) as $chunk) {
$chunks[] = new static($chunk);
}
return new static($chunks);
}**
CursorAI(GPT4)に聞いて分かったことも交えつつ解説します。
**if ($size <= 0) {
return new static;
}**
- $size が 0以下なら新しい空のCollectionを返す
0やマイナスの数でかたまりを作ることはできないため。
**$chunks = [];
foreach (array_chunk($this->items, $size, true) as $chunk) {
$chunks[] = new static($chunk);
}**
- chunks にPHPのarray_chunk関数によって出来た$sizeごとに区切られたかたまりが入る
- $chunks に入る前に$chunkはコレクション化される
**return new static($chunks);**
- $chunks をコレクション化して返す
まとめ
コレクションのchunkメソッドは以下のような特徴を持つ
- 元のCollectionを指定された数ごとに分割する
- その実装はphpのarray_chunk 関数によって行われている。
導入の文面は多少無理があったかも。自然な導入ができるようになりたいものです。
AIが進化してきたら、Amazingメソッド見たいなAIが既存のメソッドを強化する見たいなメソッドも出てくるかも知れないですね(システム崩壊不可避)
おまけ CursorAI(GPT-4)に聞いたときに使った質問文
1ラウンド目
下記はLaravelのCollectionクラス内の記述です。
コードの解説を以下の点を踏まえてお願いします。
- 段階的に行う
- 小学生でも分かるような言葉を使う
- コードの引用を混じえる
"""
/**
* Chunk the collection into chunks of the given size.
*
* @param int $size
* @return static<int, static>
*/
public function chunk($size)
{
if ($size <= 0) {
return new static;
}
$chunks = [];
foreach (array_chunk($this->items, $size, true) as $chunk) {
$chunks[] = new static($chunk);
}
return new static($chunks);
}
"""
コメント