PHPで配列を結合(マージ)、文字列で連結する方法

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PHPで配列同士を結合する方法はいくつかあります。

単純に+(プラス)演算子での結合や、array_merge()などを使う方法など、やり方によって上書きされたりと動作が異なります。

配列を結合し一つの文字列にしてくれるimplode()も併せてご紹介します。

 

「+」(プラス)演算子で配列同士を結合

Array
(
[0] => 横浜
[1] => 大阪
[2] => 福岡
[3] => nagoya
)

+(プラス)演算子で結合すると、上記のようになぜか変数$city2nagoyaしか結合されていませんね。

なぜこんなことになるのでしょうか?

「+」演算子はキーが重複したら「前優先」でキーがセットされる

よく分かりませんね。

つまり+演算子の結合でキーが重複したら、最初のキーだけしか残らないんですね。

重複した2個目以降のキーと値は無視されるため、「前優先」です。

上記の例だと、キー[0][2]は重複しているため、$city1の方だけが残り、重複しない$city2のキー[3]だけが残り、結合されたというわけです。

array_merge関数で配列を結合(マージ)する

Array
(
[0] => 横浜
[1] => 大阪
[2] => 福岡
[3] => yokohama
[4] => osaka
[5] => fukuoka
[6] => nagoya
)

array_merge()を使うと、キーが重複した部分の値も新たにキーが振られ、きちんと結合してくれましたね。

array_merage関数の構文

array_merge(結合する配列1, 結合する配列2 (,・・・));

結合したい配列を後ろにカンマ区切りで繋げていくだけです。

結果の配列を上記のように返してくれます。

連想配列の場合、文字列と数値で結果が違う

キーが数値の場合は添字配列同様、後ろに結合される

Array
(
[0] => 横浜
[1] => 名古屋
[2] => 大阪
[3] => 福岡
[4] => 川崎
[5] => 豊田
[6] => 大阪
[7] => 福岡
)

連想配列のキーが数値の場合は、キーが重複しても全て結合されました。

結合の際は、0から始まる連番が自動で振り直され、任意の数値をキーに設定していた場合、キーが変わってしまうため注意しましょう。

キーの部分をよく見ると変数$city3'3'$city4'1'などは文字列型の数字ですが、型は関係なく連番になるようです。

キーが文字列の場合は「後優先」でキーが上書きされる

Array
(
[kanagawa] => 川崎
[aichi] => 豊田
[osaka] => 大阪
[fukuoka] => 福岡
)

キーが文字列型になると、キーが数値だった場合に比べ半分の値となりました。

よく見比べると変数$city5のキー[kanagawa]横浜$city6のキー[kanagawa]川崎となっており、キーが重複しているため、後ろの川崎が前の横浜を上書きしましたね。

[aichi]や他のキーも後のキーが前のキーを上書きしています。

数値か文字列かで挙動が違うので注意しましょう。

array_merge_recursive関数で再帰的に結合

結合するとき上書きするのは困る〜という人にはこの関数です!

キーが数値の場合はarray_merge()と同じ動作ですが、文字列の場合は重複したキーも残ります。

キーが文字列の場合も、重複した値を含め配列化してくれる

Array
(
[kanagawa] => Array
(
[0] => 横浜
[1] => 川崎
)
[aichi] => Array
(
[0] => 名古屋
[1] => 豊田
)
[osaka] => Array
(
[0] => 大阪
[1] => 大阪
)
[fukuoka] => Array
(
[0] => 福岡
[1] => 福岡
)
)

なんと、重複したキーを守るために配列を一つ増やし、多次元配列で返してくれました。

重複したキーも含め、全ての値が配列化され返されましたね。

array_merge_recursive関数の構文

array_merge_recursive(結合する配列1, 結合する配列2 (,・・・));

結合したい配列を後ろにカンマ区切りで繋げていくだけです。

結果の配列を上記のように返してくれます。

とても便利ですね。

implode関数で配列を結合し、1つの文字列にする

implode()はこれまでの関数と違い、配列を結合したら文字列が返ってきます。

神奈川県横浜市港南区上大岡西
2016/01/23

簡単に結合できましたね。

implode関数の構文

implode(区切り文字(省略可), 結合したい配列);

区切り文字を指定すると、区切り文字付きの文字列が返ってきます。

日付や時間の処理に便利ですね。

 

逆に文字列を配列に分割するなら、explode()が便利ですよ。

参考:explode関数による特定の文字列での分割

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*