今回はPHPのarray_merge関数について解説します。
まずはarray_merge関数の使い方を学んでいただき、array_merge_recursiveという多次元配列を生成させる関数についても説明していきたいと思います。
array_merge関数には思わぬ落とし穴がありそこについても説明したいと思います。その落とし穴にハマってしまうプログラマーも多いので最後まで読んでしっかり学んでいきましょう。
目次
array_merge関数の構文
まず、array_merge関数の構文について説明します。
複数の配列をarray_merge関数の引数で渡すと、それらが結合した配列が返ってくる関数です。
1 |
配列 = array_merge (配列1, 配列2, 配列3...) |
引数には2つ以上の配列をセットできます。1つでもそのまま同じ配列が返ってきますが、配列以外の文字列や数値、NULLを入れるとエラーになるので注意しましょう。
array_merge関数の基本的な使い方
通常の配列の場合
以下の例は通常の配列の使用例です。
$array1と$array2の2つの配列をarray_merge関数に渡し、返ってきた配列($array)を出力させます。
1 2 3 4 5 6 7 8 |
$array1 = array("東京都", "神奈川県", "埼玉県"); $array2 = array("栃木県", "茨城県", "群馬県"); //配列を結合する $array = array_merge($array1, $array2); print_r($array); |
以下の通り2つの配列を結合した形で出力されました。
1 2 3 4 5 6 7 8 9 |
Array ( [0] => 東京都 [1] => 神奈川県 [2] => 埼玉県 [3] => 栃木県 [4] => 茨城県 [5] => 群馬県 ) |
連想配列の場合
今度は連想配列の例を挙げてみます。各都道府県名をキーに、県庁所在地を値にしてみました。
1 2 3 4 5 6 |
$array1 = array("東京都"=>"新宿区", "神奈川県"=>"横浜市", "埼玉県"=>"浦和市"); $array2 = array("栃木県"=>"宇都宮市", "茨城県"=>"水戸市", "群馬県"=>"高崎市"); $array = array_merge($array1, $array2); print_r($array); |
出力結果は以下のとおりになります。問題なく結合されましたね。
1 2 3 4 5 6 7 8 9 |
Array ( [東京都] => 新宿区 [神奈川県] => 横浜市 [埼玉県] => 浦和市 [栃木県] => 宇都宮市 [茨城県] => 水戸市 [群馬県] => 高崎市 ) |
array_merge_recursive関数による多次元配列化
array_merge関数ではありませんが、array_merge_recursiveという関数で多次元配列化が可能になるのでこちらも覚えましょう。
以下の例では、$array1と$array2とで同じキーを持っていて、それぞれ値だけが異なる配列があったとします。これをarray_merge_recursive関数で結合するとどうなるでしょうか。
1 2 3 4 5 6 |
$array1 = array("東京都"=>"新宿区", "神奈川県"=>"横浜市", "埼玉県"=>"浦和市"); $array2 = array("東京都"=>"中央区", "神奈川県"=>"川崎市", "埼玉県"=>"大宮市"); $array = array_merge_recursive($array1, $array2); print_r($array); |
以下の通り、同じキー同士がまとまって2次元配列化しました。このような機能を持つarray_merge_recursive関数は複雑なデータ処理で大きな力を発揮しますので覚えておくと良いでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Array ( [東京都] => Array ( [0] => 新宿区 [1] => 中央区 ) [神奈川県] => Array ( [0] => 横浜市 [1] => 川崎市 ) [埼玉県] => Array ( [0] => 浦和市 [1] => 大宮市 ) ) |
array_merge関数の落とし穴
最後にarray_merge関数の落とし穴について紹介したいと思います。この特性をきちんと把握しないと思わぬバグを作ることになるのでしっかり覚えてください。
キーが被るケース
以下のように、2つの配列でキーが被る(埼玉県が被っています)場合、array_merge関数に渡すとどのような挙動を示すのでしょうか。
1 2 3 4 5 6 |
$array1 = array("東京都"=>"新宿区", "神奈川県"=>"横浜市", "埼玉県"=>"浦和市"); $array2 = array("埼玉県"=>"大宮市", "茨城県"=>"水戸市", "群馬県"=>"高崎市"); $array = array_merge($array1, $array2); print_r($array); |
結果はご覧の通り。$array1側の埼玉県要素が$array2側の埼玉県要素に上書きされてしまいました。連想配列では同じキーの要素は共存できません。array_merge関数では後に渡した配列の方で上書きしてしまいます。
1 2 3 4 5 6 7 8 |
Array ( [東京都] => 新宿区 [神奈川県] => 横浜市 [埼玉県] => 大宮市 [茨城県] => 水戸市 [群馬県] => 高崎市 ) |
キーが数値で被るケース
今度はキーが数値で且つキーが被る場合のケースです。以下の例では2というキーが被っています。上の例の挙動からすると$array2の要素で上書きされると思うのかもしれません。
1 2 3 4 5 6 |
$array1 = array(0=>"東京都", 1=>"神奈川県", 2=>"埼玉県"); $array2 = array(2=>"栃木県", 3=>"茨城県", 4=>"群馬県"); $array = array_merge($array1, $array2); print_r($array); |
結果はご覧の通り上書きされず、なんとキーの数値が番号順に変わってしまいました。要素は消えずに済みましたがキーが数値の場合に再採番されてしまう点は注意が必要です。
1 2 3 4 5 6 7 8 9 |
Array ( [0] => 東京都 [1] => 神奈川県 [2] => 埼玉県 [3] => 栃木県 [4] => 茨城県 [5] => 群馬県 ) |
数値キーは被らなくても再採番されてしまう
以下の例ではキーは被っていません。被っていないので素直にそのまま結合されるものと思うでしょう。
1 2 3 4 5 6 |
$array1 = array(1=>"東京都", 2=>"神奈川県", 3=>"埼玉県"); $array2 = array(4=>"栃木県", 5=>"茨城県", 6=>"群馬県"); $array = array_merge($array1, $array2); print_r($array); |
結果はなんと0から再採番されてしまいました。キーが数値である場合は結合時に0から再採番されてしまうのです。
1 2 3 4 5 6 7 8 9 |
Array ( [0] => 東京都 [1] => 神奈川県 [2] => 埼玉県 [3] => 栃木県 [4] => 茨城県 [5] => 群馬県 ) |
まとめ
いかがでしょうか。PHPでarray_merge関数を使った配列の結合について解説しました。
array_merge関数の基本的な使い方から、多次元配列を生成させるarray_merge_recursiveという便利な関数についてもおわかりいただけたかと思います。また、array_merge関数には思わぬ落とし穴があり、これを知らないとバグを作ってしまう危険があることも把握いただけたでしょうか。
欠点はあるものの、うまく使いこなすことで複雑なデータでも効率的に処理できるようになります。ぜひ覚えておいてください。