PHPで配列同士を結合する方法はいくつかあります。
単純に+
(プラス)演算子での結合や、array_merge()
などを使う方法など、やり方によって上書きされたりと動作が異なります。
配列を結合し一つの文字列にしてくれるimplode()
も併せてご紹介します。
目次
「+」(プラス)演算子で配列同士を結合
1 2 3 4 |
$city1 = array('横浜','大阪','福岡'); $city2 = array('yokohama','osaka','fukuoka','nagoya'); print_r($city1 + $city2); |
Array
(
[0] => 横浜
[1] => 大阪
[2] => 福岡
[3] => nagoya
)
+
(プラス)演算子で結合すると、上記のようになぜか変数$city2
のnagoya
しか結合されていませんね。
なぜこんなことになるのでしょうか?
「+」演算子はキーが重複したら「前優先」でキーがセットされる
よく分かりませんね。
つまり+
演算子の結合でキーが重複したら、最初のキーだけしか残らないんですね。
重複した2個目以降のキーと値は無視されるため、「前優先」です。
上記の例だと、キー[0]
〜[2]
は重複しているため、$city1
の方だけが残り、重複しない$city2
のキー[3]
だけが残り、結合されたというわけです。
array_merge関数で配列を結合(マージ)する
1 2 3 4 |
$city1 = array('横浜','大阪','福岡'); $city2 = array('yokohama','osaka','fukuoka','nagoya'); print_r(array_merge($city1, $city2)); |
Array
(
[0] => 横浜
[1] => 大阪
[2] => 福岡
[3] => yokohama
[4] => osaka
[5] => fukuoka
[6] => nagoya
)
array_merge()
を使うと、キーが重複した部分の値も新たにキーが振られ、きちんと結合してくれましたね。
array_merage関数の構文
array_merge(結合する配列1, 結合する配列2 (,・・・));
結合したい配列を後ろにカンマ区切りで繋げていくだけです。
結果の配列を上記のように返してくれます。
連想配列の場合、文字列と数値で結果が違う
キーが数値の場合は添字配列同様、後ろに結合される
1 2 3 4 |
$city3 = array(4=>'横浜', 1=>'名古屋','3'=>'大阪',2=>'福岡'); $city4 = array('1'=>'川崎',8=>'豊田',13=>'大阪','14'=>'福岡'); print_r(array_merge($city3, $city4)); |
Array
(
[0] => 横浜
[1] => 名古屋
[2] => 大阪
[3] => 福岡
[4] => 川崎
[5] => 豊田
[6] => 大阪
[7] => 福岡
)
連想配列のキーが数値の場合は、キーが重複しても全て結合されました。
結合の際は、0から始まる連番が自動で振り直され、任意の数値をキーに設定していた場合、キーが変わってしまうため注意しましょう。
キーの部分をよく見ると変数$city3
の'3'
や$city4
の'1'
などは文字列型の数字ですが、型は関係なく連番になるようです。
キーが文字列の場合は「後優先」でキーが上書きされる
1 2 3 4 |
$city5 = array('kanagawa'=>'横浜','aichi'=>'名古屋','osaka'=>'大阪','fukuoka'=>'福岡'); $city6 = array('kanagawa'=>'川崎','aichi'=>'豊田','osaka'=>'大阪','fukuoka'=>'福岡'); print_r(array_merge($city5, $city6)); |
Array
(
[kanagawa] => 川崎
[aichi] => 豊田
[osaka] => 大阪
[fukuoka] => 福岡
)
キーが文字列型になると、キーが数値だった場合に比べ半分の値となりました。
よく見比べると変数$city5
のキー[kanagawa]
は横浜
で$city6
のキー[kanagawa]
は川崎
となっており、キーが重複しているため、後ろの川崎
が前の横浜
を上書きしましたね。
[aichi]
や他のキーも後のキーが前のキーを上書きしています。
数値か文字列かで挙動が違うので注意しましょう。
array_merge_recursive関数で再帰的に結合
結合するとき上書きするのは困る〜という人にはこの関数です!
キーが数値の場合はarray_merge()
と同じ動作ですが、文字列の場合は重複したキーも残ります。
キーが文字列の場合も、重複した値を含め配列化してくれる
1 2 3 4 |
$city5 = array('kanagawa'=>'横浜','aichi'=>'名古屋','osaka'=>'大阪','fukuoka'=>'福岡'); $city6 = array('kanagawa'=>'川崎','aichi'=>'豊田','osaka'=>'大阪','fukuoka'=>'福岡'); print_r(array_merge_recursive($city5, $city6)); |
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()
はこれまでの関数と違い、配列を結合したら文字列が返ってきます。
1 2 3 4 5 |
$addr = array('神奈川県','横浜市','港南区','上大岡西'); $date = array('2016','01','23'); echo implode($addr); echo implode('/',$date); |
神奈川県横浜市港南区上大岡西
2016/01/23
簡単に結合できましたね。
implode関数の構文
implode(区切り文字(省略可), 結合したい配列);
区切り文字を指定すると、区切り文字付きの文字列が返ってきます。
日付や時間の処理に便利ですね。
逆に文字列を配列に分割するなら、explode()
が便利ですよ。