times — 指定回数ぶん要素を生成する

collection
  • カテゴリ: 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

引数(表)

引数必須既定値説明
$numberint生成回数(0 以下なら空コレクション)
$callbackcallable|nullnull各回で呼ばれる処理。引数には 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始まり:コールバックの $i1..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)[]

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする