【Laravel】Collectionのchunkメソッドの使い方!

Laravel

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で回して利用可能

分割して表示したいケースは意外と多いので、覚えておくと便利なメソッドです。

コメント