(PHP) array_merge関数の使い方【array_merge_recursiveとの違いも】

(PHP) array_merge関数の使い方【array_merge_recursiveとの違いも】

 

phpを書いていて、
array_merge関数array_merge_recursive関数を使う機会があった。

簡単に結論から述べると、
どちらも複数ある配列を一つにまとめることができる関数だ。
ただ、まとめ方が若干異なる。

今回は、備忘録も兼ねて、
array_merge関数とarray_merge_recursive関数の使い方、および、
array_merge関数とarray_merge_recursive関数の違いなんかも含めて記事にまとめる。

 

array_merge関数の使い方

array_merge関数は、
配列の要素の最後にひとつまたは複数の配列を結合することができる関数だ。

array_merge関数の書式は以下。

# array_merge関数の書式

$ret = array_merge ( $配列1 [, 配列2 $... ] );

 

引数には、結合したい配列を、配列の分だけ順番に引数に指定していく。
2個以上(複数)を指定しても大丈夫。

返り値は、引数で指定した配列の値をマージした結果の「配列」を返す。

 




一次元配列を結合する

以下に一次元配列を結合するサンプルプログラムを紹介する。

# 配列を作成
$array1 = [1, 2, 3];
$array2 = [40, 50, 60];
$array3 = [700, 800, 900]

# 配列を結合する
$array = array_merge($array1, $array2, $array3);

# 出力
print_r($array);


# 実行結果:
Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 40
   [4] => 50
   [5] => 60
   [6] => 700
   [7] => 800
   [8] => 900
)

 

array_merge関数を使用して、
配列$array1、$array2、$array3を結合しているのが分かる。

 

また、以下のように文字列の配列も結合可能

# 配列を作成
$color1 = ['red', 'blue', 'green'];
$color2 = ['pink', 'yellow'];
$color3 = ['purple'];

# 配列を結合する
$color_merge = array_merge($color1, $color2, $color3);

# 出力
print_r($color_merge);

#実行結果:
Array
(
   [0] => red
   [1] => blue
   [2] => green
   [3] => pink
   [4] => yellow
   [5] => purple
)

 

連想配列を結合する

array_merge関数を使えば、連想配列も結合することが可能

# 連想配列を作成
$color1 = [
   0=>'red',
   1=>'blue',
   2=>'green',
   3=>'pink',
   4=>'yellow'
];

$color2 = [
   0=>'purple',
   1=>'orange',
   2=>'black'
];

# 配列をマージする
$color_merge = array_merge($color1, $color2);

# 出力
print_r($color_merge);

# 実行結果:
Array
(
   [0] => red
   [1] => blue
   [2] => green
   [3] => pink
   [4] => yellow
   [5] => purple
   [6] => orange
   [7] => black
)

 

array_merge関数を使用すれば、上記のように連想配列も結合できる。

注意点としては、配列$color1と$color2とでは、
重複しているキーである0,1,2を指定している。

このようにキーの数値が重複していた場合、ゼロから始まる連続した数値に置き換えられる
そのため、今回では$color2のKey値が0,1,2から5,6,7に置き換えられている。

 




array_merge_recursive関数の使い方

array_merge_recursive関数は、
2つ以上の配列を再帰的にマージすることがでできる関数だ。

array_merge_recursive関数の書式は以下。

$ret = array_merge_recursive ( $配列 [, 配列 $... ] )

 

引数、戻り値は、array_merge関数と変わりない。

基本的には前述したarray_merge関数と同様で、
配列の要素の最後に指定した配列をマージする。

しかし、
キーの添字が文字列の場合、値を上書きしないで同じ文字列同士で配列を作成する。
これが、array_mergeとの決定的な違いだろう。

添字が数値の場合の動作はarray_merge関数と同様だ。

以下にarray_merge_recursive関数で配列同士を結合するサンプルプログラムを紹介する。

# 連想配列を作成
$colors1 = [
   'key1'=>'red',
   'key2'=>'yellow',
   'key3'=>'green',
   'key4'=>'blue',
   'key5'=>'orange
];

$colors2 = [
   'key1'=>'black',
   'key2'=>'pink',
   'key3'=>'purple'
];

# 配列をマージする
$colors = array_merge_recursive($colors1, $colors2);

print_r($colors);

# 実行結果:
Array
   (
      [key1] => Array
           (
               [0] => red
               [1] => black
           )
 
      [key2] => Array
           (
               [0] => yellow
               [1] => pink
           )

      [key3] => Array
           (
               [0] => green
               [1] => purple
           )

      [key4] => blue
      [key5] => orange
   )

 

前述したようにarray_merge_recursive関数は、
Key値の添字が文字列の場合は、同じ文字列同士で配列を作成する

 

プラス(+)演算子で結合する

プラス(+)演算子を使用することでもarray_merge関数と同様に配列を結合することができる。

プラス演算子で配列を結合するには「$配列1 + $配列2」のように記述する。

# 連想配列を作成
$colors1 = [
   'key1'=>'red',
   'key2'=>'yellow',
   'key3'=>'green',
];

$colors2 = [
   'key4'=>'black',
   'key5'=>'pink',
];

$colors = $colors1 + $colors2;

print_r($colors);

# 実行結果:
Array
   (
      [key1] => red
      [key2] => yellow
      [key3] => green
      [key4] => black
      [key5] => pink
   )

 

このようにarray_merge関数を使わなくても、
プラス演算子で配列の結合は可能だ。

注意点としては、プラス演算子は配列1の後ろに配列2が結合されるのではなく、
配列のキーが重複していた場合は、先の配列のキーが優先される

例えば、以下のように結合したい配列のキーが重複していたら、結合する配列の値は破棄されてしまう。

# 連想配列を作成
$colors1 = [
   'key1'=>'red',
   'key2'=>'yellow',
   'key3'=>'green',
];

$colors2 = [
   'key1'=>'black',
   'key2'=>'pink',
];

$colors = $colors1 + $colors2;

print_r($colors);

# 実行結果:
Array
   (
      [key1] => red
      [key2] => yellow
      [key3] => green
   )

 

colors2の、key1とkey2の値が、マージされずに破棄されたのが確認できるだろう。

 

おまけ

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。