put — キー指定で要素を追加・上書きする(破壊的)

collection
  • カテゴリ: collection
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: Illuminate\Support\Collection::put
  • 関連: get / pull / push / forget / replace
  • 変更履歴: なし(互換的に安定)

要点(TL;DR)

  • 何に使うか:コレクションに 任意キーの値を追加・上書きする
  • 最低限の使い方(1行コード):collect()->put('key', 'value');
  • よくある罠:
    • 破壊的(元のコレクションを変更)なので、参照共有していると意図せず影響する
    • ドット記法のネスト更新はできないa.b は文字列キー扱い)→ ネストは data_set / Arr::set
    • 返り値は $this(同一インスタンス) なので、チェーンはできるが「新しいコレクションが返る」と誤解しやすい (Laravel)

概要

put は、コレクションに対して 指定キーの値をセットするためのメソッドです。設定済みのキーなら上書き、未設定なら追加になります。設定用の「軽いミューテータ」として、DTO生成前の整形やレスポンス組み立てでよく使います。 (Laravel)

構文 / シグネチャ

use Illuminate\Support\Collection;

/** @return $this */
$collection->put(mixed $key, mixed $value);
  • 引数
引数必須既定値説明
$keymixedはいなしセットするキー(文字列 / 数値など)
$valuemixedはいなしセットする値
  • 戻り値$this(同一コレクション。メソッドチェーン可能) (Laravel API)
  • 例外/副作用:例外は通常なし。コレクションを破壊的に更新します。 (Laravel API)

使用例

最小例

<?php

use Illuminate\Support\Collection;

$collection = collect(['product_id' => 1, 'name' => 'Desk']);

$collection->put('price', 100);

var_dump($collection->all());
// ['product_id' => 1, 'name' => 'Desk', 'price' => 100]

(Laravel公式ドキュメントの例と同じ挙動です) (Laravel)

実務例

<?php

use App\Models\User;
use Illuminate\Http\Request;

final class ProfileController
{
    public function show(Request $request)
    {
        /** @var User $user */
        $user = $request->user();

        // レスポンス用の“組み立て用コレクション”として put を使う
        $payload = collect()
            ->put('id', $user->id)
            ->put('name', $user->name)
            ->put('is_admin', $user->is_admin)
            ->put('updated_at', $user->updated_at?->toAtomString());

        return response()->json($payload->all());
    }
}

よくある落とし穴・注意

  • **破壊的(mutable)**です。$a = $collection; $a->put(...)$collection 側にも影響します(同一インスタンス)。 (Laravel API)
  • ネストの更新(ドット記法)には向きません。
    put('meta.color', 'red')['meta.color' => 'red'] のように「文字列キー」が増えるだけです。ネスト更新は data_set()Illuminate\Support\Arr::set() を検討してください。
  • 計算量の目安:キー指定のセットは概ね O(1)(PHP配列のハッシュ操作相当)。
  • キー保持:キー付きコレクションに対して指定キーでセットするので、当然キーは保持されます。

入出力対応表(小サンプル)

入力操作出力
collect(['a' => 1])->put('b', 2)['a' => 1, 'b' => 2] (Laravel)
collect(['a' => 1])->put('a', 9)['a' => 9]
collect([])->put('x', null)['x' => null]

代替・関連APIとの比較

  • get($key, $default = null):取得。セットはしない(読み取り用途)。
  • pull($key, $default = null):取得しつつ削除(取り出し用途)。 (Laravel)
  • push($value, ...):末尾追加(数値キー配列っぽく扱う用途)。
  • forget($key):キー削除(セットの逆)。
  • replace($items) / merge($items):複数要素をまとめて反映したいときに有利。
    選定基準:1件だけキー指定で更新したいなら put、複数まとめてなら merge/replace、取り出して消すなら pull

テスト例(Pest)

<?php

use Illuminate\Support\Collection;

it('put sets the given key and value (mutates)', function () {
    $c = collect(['a' => 1]);

    $returned = $c->put('b', 2);

    expect($returned)->toBe($c);               // $this が返る
    expect($c->all())->toBe(['a' => 1, 'b' => 2]);
});

トラブルシュート(エラー別)

症状/エラー原因対処
put('a.b', 1) でネストが更新されないput はドット記法を解釈しないネストは data_set / Arr::set を使う
どこかの処理で値が勝手に変わる同じコレクションインスタンスを参照共有して put しているclone する / 破壊しない設計(配列作成→collect())にする

参考リンク

  • Laravel 公式ドキュメント(Collections: put) (Laravel)
  • Laravel API(Illuminate\Support\Collection::put$this を返す) (Laravel API)
レン (Wren)

こんにちは。レンです。

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

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

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

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

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

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