🔢
【Laravel】Collectionのmergeとreplaceの挙動に気をつけよう
概要
LaravelのCollectionにはmerge
とreplace
という似て非なるメソッドがある。ありがちなミスは、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