Menu

PHPのarray_merge():2つ以上の配列を結合する

array_merge($a, $b)は配列を1つにまとめます。数値キーの値は追加されて番号が振り直され、文字列キーでは後の配列が優先されます。array_mergeと+演算子やスプレッド構文[...$a, ...$b]との違い、配列のリストの結合、array_merge_recursiveやarray_replaceが向いている場面を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

array_merge($a, $b)は、$aの要素のあとに$bの要素が続く新しい配列を返します。数値キーは0から振り直され、両方の配列に同じ文字列キーがあるときは後の配列の値が優先されます。配列はいくつでも渡せます。

array_merge()は引数を変更しません。結合した配列を返すので、結果を代入します:$all = array_merge($all, $more);。

数値キーは振り直される

array_merge()は整数キーを名前ではなく位置として扱います。整数キーを持つ要素はすべて追加され、配列が同じ番号や欠番を使っていても、0からの新しいキーが振られます。リストならそれが望みどおりですが、番号がIDのときは驚くことになります。

整数に見える文字列キー('101')は整数として保存されるので、これも振り直されます。'id101'のようなキーはそのままです。

array_mergeと+演算子の違い

+演算子(配列の和)も配列を結合しますが、ルールが逆です。左の配列にすでにあるキーでは左の値が優先され、右の値は捨てられます。番号の振り直しはしません。そのため、既定値を埋めるには+が、上書きするにはarray_merge()が自然な方法です。

array_merge($a, $b)$a + $b
同じ文字列キー$bの値$aの値
整数キー振り直し、すべての値を保持保持、ぶつかった$bの値は消える
典型的な用途リストの結合、設定の上書き既定値の補完、IDの保持

ブロックの最後の例は+の定番の罠です。キー0と1がすでに左にあるので、['a', 'b'] + ['x', 'y', 'z']はa, b, zになります。

スプレッド構文:[...a,...a, ...b]

スプレッド演算子は、配列リテラルの中で配列を展開します。array_merge()と同じように動き、整数キーは振り直され、PHP 8.1以降は文字列キーも使えて後のものが優先されます。配列と単独の値を混ぜるときに読みやすくなります。

既存の配列にその場で配列を追加する方法は、スプレッド演算子を使ったarray_push()を参照してください。

配列の配列を結合する

結合したい配列自体がリストに入っているときは、そのリストをarray_merge()に展開します。これはループの中で結合する速い方法でもあります。部品を集めてから、一度だけ結合します。

ループの中で$all = array_merge($all, $batch);と書いても動きますが、毎回大きくなっていく配列全体をコピーするので、数千件になると遅くなります。

array_merge_recursiveとarray_replace

array_merge_recursive()はネストした配列も結合しますが、単純な値を持つ重複した文字列キーでは上書きせず、両方の値を新しい配列にまとめます。設定ではそれが望みであることはまれです。そこでは、すべての階層で値を上書きしキーを保つarray_replace_recursive()が、たいてい正しい道具です。

3行のJSONを上から読んでください。array_merge()はdbの配列全体を置き換えてhostを失い、array_merge_recursive()はportとdebugを2要素のリストにし、array_replace_recursive()は意図したとおりの設定を作りました。

よくあるミス:結合しても何も取り除かれない

array_merge()は、別々のキーの下にある重複した値をそのまま残します。2つのタグのリストを結合すると、共通のタグが2回ずつ入ります。結果をarray_unique()に通し、そのあとarray_values()で番号を振り直しましょう。

行やネストした配列から重複を取り除く方法は、array_uniqueのページで扱っています。

よくある質問

PHPのarray_mergeと+の違いは何ですか?

重複する文字列キーでは、array_merge($a, $b)は$bの値を残し、$a + $bは$aの値を残します。数値キーでは、array_merge()はすべてを追加して番号を振り直し、+は数値キーを保ったまま、$aにすでにあるキーを持つ$bの要素を捨てます。

数値キーを保ったまま配列を結合するには?

左の配列を優先するなら$a + $b、右の配列を優先するならarray_replace($a, $b)を使います。array_merge()は常に数値キーを0から振り直します。

PHPで配列の配列を結合するには?

外側の配列をarray_merge()に展開します:$all = array_merge(...$lists);。リストが空なら[]を返します。先にループで配列を集め、最後に一度だけ結合しましょう。ループの中でarray_merge()を呼ぶと、そのたびに大きくなっていく結果がコピーされます。

PHPで文字列キーにスプレッド演算子を使えますか?

PHP 8.1以降は使えます。そのとき[...$a, ...$b]はarray_merge($a, $b)と同じ動きをし、数値キーは振り直され、後の文字列キーが前のものを上書きします。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める