🔢

【Laravel】Collectionのmergeとreplaceの挙動に気をつけよう

に公開

概要

LaravelのCollectionにはmergereplaceという似て非なるメソッドがある。ありがちなミスは、mergeで数値キーを保持できないこと。以下に詳細をまとめる。

mergeメソッド

  • 内部的にPHPのarray_mergeを使っているため、数値キーは再インデックス化される。
  • キーを保持したい場合には不向き。
$collection = collect([1 => 'a', 2 => 'b']);
$merged = $collection->merge([1 => 'x', 3 => 'y']);
print_r($merged->all());
// 結果: [0 => 'a', 1 => 'b', 2 => 'x', 3 => 'y']
  • 元のキー(1,2)が失われ、0からの連番に変わる点に注意。

replaceメソッド

  • 内部的にPHPのarray_replaceを使っており、キーの再インデックス化は行われない。
  • 指定したキーの値を置換し、キー構造をそのまま保持する。
$collection = collect([1 => 'a', 2 => 'b']);
$replaced = $collection->replace([1 => 'x', 3 => 'y']);
print_r($replaced->all());
// 結果: [1 => 'x', 2 => 'b', 3 => 'y']
  • 意図したキーに対して上書きができるため、キーを保持したい場合に適している。

ありがちなミス

  • mergeを使うと数値キーがリセットされることを見落とし、予期しない連番の配列になってしまう。
  • キーの整合性が求められる場合はreplaceを使うべきだが、mergeと混同してしまいがち。

まとめ

  • 数値キーを保持したい場合はreplace
  • mergeは結果の連番化が必要なケースで利用

Discussion