- カテゴリ: collection
- 掲載バージョン: Laravel 12・PHP 8.4
- 名前空間 / FQCN / コマンド:
Illuminate\Support\Collection::times - 関連:
Collection::range,collect,LazyCollection::times,map,pad - 変更履歴: なし
要点(TL;DR)
- 1〜Nのカウンタを使って、指定回数ぶんの要素を一括生成する
Collection::times(5, fn($i) => $i * 2)- 罠:コールバックの引数は1始まり/巨大NはLazyCollectionを使う
概要
Collection::times は N 回繰り返して要素を作り、コレクションを返す静的メソッドです。カウンタ 1..N をコールバックへ渡して、連番やダミーデータ、スロットなどを最短で用意できます。単なる for ループより表現が短く、そのまま後続のコレクション操作へチェーンできます。
構文 / シグネチャ
public static function times(int $number, ?callable $callback = null): Illuminate\Support\Collection
引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
$number | int | ✓ | — | 生成回数(0 以下なら空コレクション) |
$callback | callable|null | null | 各回で呼ばれる処理。引数には 1始まりのカウンタが渡る |
- 戻り値:
Illuminate\Support\Collection(0 始まりの連番キーで格納) - 例外/副作用:例外なし(通常)。メモリ使用量は生成数に比例
使用例
最小例
<?php
use Illuminate\Support\Collection;
// 1,2,3 のコレクションを作る
$numbers = Collection::times(3);
// => collect([1, 2, 3])
実務例:時間スロットの生成 + フォーマット
<?php
use Illuminate\Support\Collection;
// 00:00〜23:00 の時刻ラベルを生成
$slots = Collection::times(24)->map(
fn (int $i) => sprintf('%02d:00', $i - 1) // timesは1始まりなので -1
);
// ['00:00', '01:00', ... '23:00']
実務例:ワンタイムトークンをN個生成(DTO配列)
<?php
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
$tokens = Collection::times(5, fn (int $i) => [
'seq' => $i, // 1..5
'token' => (string) Str::uuid(),
'exp' => now()->addMinutes(30),
]);
// 後続で ->each(fn ($t) => Cache::put(...)) のようにチェーン可能
よくある落とし穴・注意
- 1始まり:コールバックの
$iは1..N。0 起点が必要なら$i - 1を使う。 - 巨大Nのメモリ:
times(1_000_000)のような大量生成はメモリ圧迫。**LazyCollection::times**で遅延評価に。 - キー:返却コレクションのキーは0始まりの連番(
0..N-1)。 - 負数/0:
$number <= 0は空を返す。例外にはならない。
代替・関連APIとの比較
Collection::range($from, $to, $step):数値レンジを作る。連番がほしいだけならこちら。collect(range(1, N)):PHP 組み込みrangeのラッパー。中間配列を介すぶん、可読性と一時コストでtimesに劣る。LazyCollection::times:大規模データで必須。遅延で O(1) 近いメモリに抑えられる。
テスト例(Pest)
<?php
use Illuminate\Support\Collection;
it('generates N items with 1-based counter', function () {
$c = Collection::times(3, fn ($i) => $i * 2);
expect($c->all())->toBe([2, 4, 6]);
});
it('returns empty when number is non-positive', function () {
expect(Collection::times(0)->isEmpty())->toBeTrue();
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
| 値が一つズレる | 0始まりだと勘違い | fn($i) => $i - 1 として補正 |
| メモリ不足 / 速度低下 | 大量生成を逐次配列化 | Illuminate\Support\LazyCollection::times に置換して遅延処理 |
| 期待したキーでない | 0始まりの再採番 | ->values() で再採番、->keyBy() で任意キー化 |
コレクション仕様メモ(カテゴリ規約)
- チェーン可否:可(静的生成 → 直後に
mapなど可能) - 破壊的/非破壊:非破壊(新規生成)
- キー保持:0 始まりの連番
- LazyCollection:対応あり(
LazyCollection::times) - 計算量:O(N)(N は
$number)
入出力対応表(小サンプル)
| 呼び出し | 出力(概念) |
|---|---|
Collection::times(3) | [1,2,3] |
Collection::times(3, fn($i)=>$i*10) | [10,20,30] |
Collection::times(0) | [] |
参考リンク
- Laravel 公式ドキュメント:Collections – times(Laravel 12)
https://laravel.com/docs/12.x/collections#method-times - Laravel 公式ドキュメント:Lazy Collections – times
https://laravel.com/docs/12.x/collections#lazy-collections - フレームワークソース(
Illuminate\Support\Collection)
https://github.com/laravel/framework/tree/12.x/src/Illuminate/Support/Collection

