LaravelのCollectionには便利なメソッドが数多く用意されています。
その中でも「一定数ごとにデータを分割したい」ときに便利なのがchunk
メソッドです。
この記事では、chunk
メソッドの基本的な使い方から、実用的な活用例まで紹介します。
chunkメソッドとは?
“chunkメソッドは、コレクションを指定したサイズごとに分割し、分割されたコレクションのコレクションを返します。
[1, 2, 3, 4, 5, 6, 7]` を3つずつに分けたいときに使えます。
たとえば配列
$numbers = collect([1, 2, 3, 4, 5, 6, 7]);
$chunkNumbers = $numbers->chunk(3);
dd($chunkNumbers->toArray());
// array:3 [▼
// 0 => array:3 [▼
// 0 => 1
// 1 => 2
// 2 => 3
// ]
// 1 => array:3 [▼
// 3 => 4
// 4 => 5
// 5 => 6
// ]
// 2 => array:1 [▼
// 6 => 7
// ]
// ]
chunkメソッドの基本的な使い方
chunk
メソッドの基本的な使い方です。
サンプルコード
$fruitArray = [
'apple', 'banana', 'grape', 'peach', 'lemon',
'orange', 'watermelon', 'cherry', 'pear', 'kiwi',
'mango', 'blueberry', 'raspberry', 'strawberry', 'melon',
];
$fruits = collect($fruitArray);
$fruits->chunk(3)->each(function($chunkFruits) {
echo implode(", ", $chunkFruits->toArray()) . "<br>";
});
$fruitArray
配列をcollect
メソッドでコレクションにして、$fruits
に格納しました。
その次の処理で、chunk
メソッドを使うことで、3つずつに分割しています。
each
を呼び出して、分割した配列ごとに処理しています。
実行結果
apple, banana, grape
peach, lemon, orange
watermelon, cherry, pear
kiwi, mango, blueberry
raspberry, strawberry, melon
chunk(3)
を指定したので、画面に表示すると、3つずつ値が表示されることが確認できました。
foreachでループして使用する
分割されたコレクションは、foreach
でも使うことができます。
$collection = collect([1, 2, 3, 4, 5, 6, 7]);
foreach ($collection->chunk(3) as $chunk) {
echo "グループ:" . implode(',', $chunk->toArray()) . "<br>";
}
$collection
に格納した後に、chunk
メソッドを使って分割し
foreach
で分割したコレクションごとに出力しています。
出力結果
グループ:1,2,3
グループ:4,5,6
グループ:7
chunkメソッドを使う実用例
chunk
メソッドを使用するときの例です。
テーブル表示で列を揃える
例えば、ビューでデータを3列ごとに表示したいときに便利です。
@foreach ($products->chunk(3) as $chunk)
<div class="row">
@foreach ($chunk as $product)
<div class="col">
{{ $product->name }}
</div>
@endforeach
</div>
@endforeach
このようにすれば、配列のデータをビューに対して、きれいに3列ずつ表示できます。
大量データをバルクインサートする
大量のデータを一度にinsert
すると、データベースによっては1回のSQLで処理できる行数に制限がある場合があります。
そこで、chunk
を使ってデータを分割し、少しずつインサートします。
これによってメモリ消費を抑えることもできます。
use Illuminate\Support\Facades\DB;
use App\Models\User;
$data = collect(range(1, 10000))->map(function ($i) {
return [
'name' => "User {$i}",
'email' => "user{$i}@example.com",
'password' => bcrypt('password'),
];
});
// 1000件ずつ分割してインサート
$data->chunk(1000)->each(function ($chunk) {
DB::transaction(function () use ($chunk) {
DB::table('users')->insert($chunk->toArray());
});
});
注意点
chunk
は新しいコレクションを返すため、元のコレクションは変更されません。- 空のコレクションに対して実行すると、空のコレクションが返ります。
- サイズに0以下を指定するとエラーになるので注意してください。
まとめ
今回はLaravelのCollectionでのchunkメソッドについて紹介しました。
まとめると、下記のようになります。
chunk($size)
は、コレクションを指定した数ごとに分割する- ビューでデータを整列表示するときや、バルクインサートするときに便利
- foreachで回して利用可能
分割して表示したいケースは意外と多いので、覚えておくと便利なメソッドです。
コメント