【PHP8.x】array_merge_recursive()関数の使い方
array_merge_recursive関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
array_merge_recursive関数は、一つまたは複数の配列を再帰的にマージする関数です。この関数は、入力として与えられた複数の配列を結合し、一つの配列として返します。もし同じキーが複数の配列に存在する場合、array_merge_recursiveは値を上書きするのではなく、それらの値を配列として再帰的にマージします。数値キーの場合、array_merge_recursiveは後続の配列の値を既存の配列に追加します。ただし、キーが文字列の場合、同じキーを持つ値は配列にマージされます。
具体的には、入力配列に同じ文字列キーが存在する場合、そのキーに対応する値が両方とも配列であれば、array_merge_recursiveはその二つの配列を再帰的にマージします。もし値が配列でない場合は、両方の値が配列に格納され、その配列が結果配列のキーに対応する値となります。数値キーの場合、array_merge_recursiveはキーを再インデックスせずに、後続の配列の値を結果配列に追加します。
この関数は、複数の設定ファイルやデータ構造を組み合わせる際に特に役立ちます。例えば、デフォルト設定とユーザー設定をマージして、最終的な設定を生成する場合などに利用できます。ただし、深いネスト構造を持つ配列をマージする際には、メモリ使用量に注意する必要があります。array_merge_recursiveは、元の配列を変更せず、新しい配列を返すため、元のデータを保持したままマージ結果を利用できます。
構文(syntax)
1array_merge_recursive ( array ...$arrays ) : array
引数(parameters)
array ...$arrays
- array ...$arrays: マージしたい配列を可変長で指定します。複数の配列をカンマ区切りで指定できます。
戻り値(return)
array
複数の配列を再帰的にマージした新しい配列を返します。キーが重複した場合、値は配列としてまとめられます。
サンプルコード
PHP array_merge_recursive でキーを保持してマージする
1<?php 2 3/** 4 * array_merge_recursive() の挙動を示すサンプルコード。 5 * キーが同じ場合、値を再帰的にマージします。 6 * 数値キーの場合は、値が重複して追加されます。 7 */ 8 9$array1 = [ 10 'color' => ['favorite' => 'red'], 11 5, 12]; 13 14$array2 = [ 15 10, 16 'color' => ['favorite' => 'green', 'blue'], 17]; 18 19$result = array_merge_recursive($array1, $array2); 20 21print_r($result); 22/* 23出力結果: 24Array 25( 26 [color] => Array 27 ( 28 [favorite] => Array 29 ( 30 [0] => red 31 [1] => green 32 ) 33 34 [0] => blue 35 ) 36 37 [0] => 5 38 [1] => 10 39) 40*/ 41 42/** 43 * キーを保持してマージしたい場合は、ループ処理で実装する必要がある。 44 */ 45function array_merge_keep_keys(array ...$arrays): array 46{ 47 $result = []; 48 foreach ($arrays as $array) { 49 foreach ($array as $key => $value) { 50 if (is_int($key)) { 51 $result[] = $value; 52 } elseif (is_array($value) && isset($result[$key]) && is_array($result[$key])) { 53 $result[$key] = array_merge_keep_keys($result[$key], $value); 54 } else { 55 $result[$key] = $value; 56 } 57 } 58 } 59 return $result; 60} 61 62$array3 = [ 63 'color' => ['favorite' => 'red'], 64 5, 65]; 66 67$array4 = [ 68 10, 69 'color' => ['favorite' => 'green', 'blue'], 70]; 71 72$result2 = array_merge_keep_keys($array3, $array4); 73 74print_r($result2); 75 76/* 77出力結果 78Array 79( 80 [color] => Array 81 ( 82 [favorite] => green 83 [0] => blue 84 ) 85 86 [0] => 5 87 [1] => 10 88) 89*/ 90
array_merge_recursive()関数は、複数の配列を再帰的にマージするPHPの組み込み関数です。引数には、マージしたい配列を可変長引数として渡します。戻り値は、マージされた新しい配列です。
この関数は、キーが同じ要素が存在する場合に、その値を再帰的にマージします。もし、同じキーの値が配列同士だった場合は、さらにそれらの配列をマージします。キーが数値の場合は、array_merge()関数と同様に、値が単純に追加され、キーは連番で振り直されます。
サンプルコードでは、$array1と$array2という2つの配列をarray_merge_recursive()でマージしています。$array1の'color'キーと$array2の'color'キーは両方とも配列であるため、それらの配列が再帰的にマージされます。数値キーの 5 と 10 は、新しい配列の [0] と [1] にそれぞれ追加されています。
一方、キーを保持してマージしたい場合は、array_merge_recursive()関数では実現できません。サンプルコードでは、array_merge_keep_keys()というユーザー定義関数で、キーを保持したまま配列を再帰的にマージする例を示しています。この関数では、is_int()関数でキーが数値かどうかを判定し、数値キーの場合は単純に値を追加します。キーが文字列で、かつ値が配列の場合は、再帰的にarray_merge_keep_keys()を呼び出してマージを行います。$array3と$array4をarray_merge_keep_keys()でマージした結果は、キーが保持され、'color'キーの値が上書きされていることがわかります。
array_merge_recursive()関数は、同じキーを持つ配列を再帰的にマージする際に、数値キーの場合、値が単純に追加される点に注意が必要です。文字列キーが重複する場合は、値が配列としてマージされます。もしキーを保持して上書きするようなマージ処理を行いたい場合は、サンプルコードにあるarray_merge_keep_keys()のような独自の関数を実装する必要があります。この関数は、キーが数値の場合は単純に追加し、文字列キーの場合は値を上書きします。array_merge_recursive()とarray_merge_keep_keys()は挙動が異なるため、目的に応じて使い分けるようにしてください。また、PHPのバージョンによっては動作が異なる可能性があるので、使用する環境での動作確認を推奨します。
PHP array_merge_recursive 再帰結合する
1<?php 2 3/** 4 * array_merge_recursive 関数の動作を示すサンプルコードです。 5 * 6 * この関数は複数の配列を再帰的に結合します。 7 * 'overwrite' というキーワードに対する重要な点は、 8 * 同じ文字列キーを持つ要素があった場合、新しい値で既存の値を上書きするのではなく、 9 * 両方の値を新しい配列として結合する点です。 10 * 数値キーを持つ要素は、単純に追加されます。 11 */ 12function demonstrateArrayMergeRecursive(): void 13{ 14 // 最初の配列を定義します。 15 $array1 = [ 16 'fruit' => 'apple', 17 'colors' => ['red', 'green'], 18 'details' => [ 19 'origin' => 'Japan', 20 'taste' => 'sweet', 21 ], 22 0 => 'item_from_array1_index0', 23 ]; 24 25 // 2番目の配列を定義します。 26 // $array1 と同じキーを持つ要素が含まれています。 27 $array2 = [ 28 'fruit' => 'orange', // 'fruit' キーは $array1 にも存在 29 'colors' => ['blue'], // 'colors' キーは $array1 にも存在 30 'details' => [ 31 'taste' => 'sour', // 'details' の中の 'taste' キーは $array1 にも存在 32 'season' => 'summer', // 新しいキー 33 ], 34 0 => 'item_from_array2_index0', // 数値キー0は $array1 にも存在 35 ]; 36 37 echo "--- 元の配列 ---" . PHP_EOL; 38 echo "配列 1:" . PHP_EOL; 39 print_r($array1); 40 echo "配列 2:" . PHP_EOL; 41 print_r($array2); 42 echo PHP_EOL; 43 44 // array_merge_recursive を使用して配列を結合します。 45 // 同じ文字列キーを持つ要素がどのように扱われるかに注目してください。 46 $mergedArray = array_merge_recursive($array1, $array2); 47 48 echo "--- array_merge_recursive の結果 ---" . PHP_EOL; 49 print_r($mergedArray); 50 echo PHP_EOL; 51 52 echo "--- 'overwrite' に関する補足 ---" . PHP_EOL; 53 echo "結果を確認すると、'fruit' キーの値は 'orange' で上書きされず、" . PHP_EOL; 54 echo "['apple', 'orange'] という新しい配列として結合されていることがわかります。" . PHP_EOL; 55 echo "同様に、ネストされた配列の 'details' -> 'taste' も上書きされず、" . PHP_EOL; 56 echo "['sweet', 'sour'] として結合されています。" . PHP_EOL; 57 echo "数値キー (例: 0) の要素は単純に追加され、新しいインデックスが割り当てられます。" . PHP_EOL; 58} 59 60// 関数を実行します。 61demonstrateArrayMergeRecursive(); 62
PHPのarray_merge_recursive関数は、複数の配列を再帰的に結合するために利用される拡張機能です。この関数は引数として結合したい複数の配列を受け取り、それらを結合した新しい配列を返します。
この関数の大きな特徴は、同じ文字列キーを持つ要素があった場合の挙動です。通常、配列の結合では後から来た値が前の値を上書き(overwrite)することがありますが、array_merge_recursiveでは値を上書きせず、同じキーの値を新しい配列として結合します。例えば、'fruit' => 'apple' と 'fruit' => 'orange' がある場合、結合結果は'fruit' => ['apple', 'orange'] のようになります。この再帰的な結合は、ネストされた配列に対しても適用されます。一方で、数値キーを持つ要素は、同じキーがあったとしても単純に結合後の配列に追加されます。
このため、既存の値を上書きすることなく、共通のキーに関連するすべての値を新しい配列として保持したい場合に特に有用です。
array_merge_recursive関数は、複数の配列を再帰的に結合します。この関数の最も重要な注意点は、キーが重複した場合の挙動です。同じ文字列キーを持つ要素があった場合、後の配列の値で前の配列の値が上書きされるのではなく、両方の値が新しい配列として結合されます。これはネストされた配列に対しても同様です。一方、同じ数値キーを持つ要素は上書きされず、単純に末尾に追加されます。この「上書きではなく結合」という動作を理解せず利用すると、意図しないデータ構造が生成される可能性があります。特に文字列キーの結合ロジックを把握しておくことが、本関数を安全かつ正しく利用するための重要なポイントです。
PHP array_merge_recursiveで配列をユニークに結合する
1<?php 2 3/** 4 * array_merge_recursive の動作と、その「ユニークな」結合特性を示すサンプルコード。 5 * 6 * この関数は、複数の配列を再帰的に結合します。 7 * - 同じ文字列キーが存在する場合、その値は上書きされず、結合された配列として格納されます。 8 * - 同じ数値キーが存在する場合、値は単純に追加されます(上書きも配列化もされません)。 9 * - ネストされた配列も、上記のルールに従って再帰的に結合されます。 10 * 11 * この挙動は、情報を失わずに結合するという点で、 12 * キーが重複した場合に値を上書きする array_merge とは異なる、ユニークなマージ方法を提供します。 13 * ただし、結合された配列内の個々の要素の値自体に重複がある場合、それを自動的に排除する機能はありません。 14 */ 15function demonstrateArrayMergeRecursive(): void 16{ 17 echo "--- 1. 基本的な配列の結合 ---\n"; 18 19 $array1 = [ 20 'name' => 'Alice', 21 'skills' => ['PHP', 'SQL'], 22 0 => 'item1_from_array1', // 数値キー 23 ]; 24 25 $array2 = [ 26 'name' => 'Bob', 27 'age' => 30, 28 'skills' => ['JavaScript', 'HTML'], 29 0 => 'item2_from_array2', // 数値キー 30 ]; 31 32 echo "最初の配列:\n"; 33 print_r($array1); 34 35 echo "二番目の配列:\n"; 36 print_r($array2); 37 38 // array_merge_recursive を使用して配列を結合 39 $mergedArraySimple = array_merge_recursive($array1, $array2); 40 41 echo "結合結果 (array_merge_recursive):\n"; 42 print_r($mergedArraySimple); 43 /* 44 期待される出力: 45 Array 46 ( 47 [name] => Array // 'name' キーが重複したため、値が配列として結合された 48 ( 49 [0] => Alice 50 [1] => Bob 51 ) 52 [skills] => Array // 'skills' キーも重複したため、値が配列として結合された 53 ( 54 [0] => PHP 55 [1] => SQL 56 [2] => JavaScript 57 [3] => HTML 58 ) 59 [0] => item1_from_array1 // 数値キーは単純に追加される 60 [age] => 30 61 [1] => item2_from_array2 // 数値キーは単純に追加される 62 ) 63 */ 64 65 echo "\n--- 2. ネストされた配列の結合 ---\n"; 66 67 $array3 = [ 68 'user' => [ 69 'id' => 101, 70 'settings' => ['theme' => 'dark', 'notifications' => true], 71 'roles' => ['admin'], 72 ], 73 'status' => 'active', 74 ]; 75 76 $array4 = [ 77 'user' => [ 78 'settings' => ['language' => 'ja', 'notifications' => false], 79 'roles' => ['editor'], 80 ], 81 'status' => 'pending', 82 'timestamp' => time(), 83 ]; 84 85 echo "三番目の配列:\n"; 86 print_r($array3); 87 88 echo "四番目の配列:\n"; 89 print_r($array4); 90 91 // ネストされた配列も array_merge_recursive で結合 92 $mergedArrayNested = array_merge_recursive($array3, $array4); 93 94 echo "結合結果 (ネストされた配列):\n"; 95 print_r($mergedArrayNested); 96 /* 97 期待される出力例: 98 Array 99 ( 100 [user] => Array 101 ( 102 [id] => 101 // 'id' は重複しないためそのまま 103 [settings] => Array // 'settings' が重複したため再帰的に結合 104 ( 105 [theme] => dark 106 [notifications] => Array // boolean値が結合され、trueは1、falseは空文字列として扱われる 107 ( 108 [0] => 1 109 [1] => 110 ) 111 [language] => ja 112 ) 113 [roles] => Array // 'roles' が重複したため再帰的に結合 114 ( 115 [0] => admin 116 [1] => editor 117 ) 118 ) 119 [status] => Array // 'status' が重複したため、値が配列として結合 120 ( 121 [0] => active 122 [1] => pending 123 ) 124 [timestamp] => (現在のタイムスタンプ) // 'timestamp' は重複しないためそのまま 125 ) 126 */ 127} 128 129// 関数を実行して動作を確認します 130demonstrateArrayMergeRecursive();
PHPのarray_merge_recursive関数は、複数の配列を一つに結合するための機能を提供します。この関数は引数として結合したい配列をいくつでも受け取り、それらを結合した新しい配列を返します。特に、キーが重複した場合の挙動にユニークな特性を持つのが特徴です。
同じ文字列キーが存在する場合、array_mergeのように値を上書きするのではなく、重複した値を保持したまま、そのキーの値を新しい配列として格納します。例えば、両方の配列に'name'キーがあった場合、結果の配列では'name'の値がさらに配列となり、元の両方の値が含まれる形になります。一方、同じ数値キーが存在する場合は、値は単純に追加され、上書きも配列化もされません。また、ネストされた配列に対しても同様のルールが再帰的に適用され、深さに関わらず内容を結合します。
この関数は、既存の情報を失わずに複数の設定やデータを統合したい場合に非常に有用です。ただし、結合された配列内の個々の要素の値自体に重複があったとしても、それを自動的に排除する機能は備わっていませんのでご注意ください。
array_merge_recursiveは、複数の配列を再帰的に結合する関数です。同じ文字列キーが存在する場合、値は上書きされず、そのキーに属する値がすべて格納された新たな配列が作成されます。これは、キーが重複した際に値を上書きするarray_mergeと大きく異なるため注意が必要です。一方、数値キーは重複しても上書きされず、単純に追加されます。ネストされた配列も、これらのルールに従って再帰的に結合されますが、特にboolean値などが結合されると、trueが1、falseが空文字列となるなど、予期せぬ値の型変換が発生する可能性があるため、結果の型に注意してください。この関数の「ユニークな」結合特性は、キーの重複による情報損失を防ぐ点にあり、結合された配列内の個々の要素自体の重複を自動的に排除する機能はありません。要素の重複排除が必要な場合は、別途array_uniqueなどの関数と組み合わせて利用を検討してください。
PHP配列マージ関数 array_merge と array_merge_recursive の違いを理解する
1<?php 2 3/** 4 * array_merge と array_merge_recursive の違いを示すサンプルコード 5 * 6 * このスクリプトは、PHPの配列マージ関数 array_merge と array_merge_recursive が、 7 * 同じキーを持つ要素(特に連想配列)をどのように扱うかの違いをデモンストレーションします。 8 * システムエンジニアを目指す初心者が、配列結合の際にどちらの関数を選択すべきかを 9 * 理解するのに役立つように設計されています。 10 */ 11 12// マージする最初の配列を定義します。 13// 各キーのデータ型に注意してください。特に'options'と'tags'はネストされた配列です。 14$array1 = [ 15 'user_id' => 101, 16 'username' => 'alice', 17 'preferences' => [ 18 'theme' => 'dark', 19 'language' => 'en', 20 ], 21 'roles' => ['admin', 'editor'], 22 'status' => 'active', 23]; 24 25// マージする2番目の配列を定義します。 26// $array1 と同じキーや、ネストされた配列内で同じキーを持つ要素を含めます。 27$array2 = [ 28 'user_id' => 102, // 'user_id' はスカラ値で重複 29 'username' => 'bob', // 'username' はスカラ値で重複 30 'preferences' => [ 31 'theme' => 'light', // 'preferences'内の'theme'が重複 32 'notifications' => true, 33 ], 34 'roles' => ['viewer', 'editor'], // 'roles' は数値添字配列で重複 35 'last_login' => '2023-10-27', 36]; 37 38echo "--- 元の配列 ---" . PHP_EOL; 39echo "配列1 (\$array1): " . PHP_EOL; 40var_dump($array1); 41echo "配列2 (\$array2): " . PHP_EOL; 42var_dump($array2); 43echo PHP_EOL; 44 45// array_merge の使用例 46// array_merge は、文字列キーが重複する場合、後の配列 ($array2) の値で上書きします。 47// ネストされた連想配列も、上位レベルのキーが重複すれば全体が上書きされます。 48// 数値添字配列(例: 'roles')は、単純に要素が追加されます(キーは再インデックスされます)。 49echo "--- array_merge の結果 ---" . PHP_EOL; 50$mergedArray = array_merge($array1, $array2); 51var_dump($mergedArray); 52echo "備考:" . PHP_EOL; 53echo " - 'user_id'と'username'は、\$array2の値(102と'bob')で上書きされました。" . PHP_EOL; 54echo " - 'preferences'は、\$array2の'preferences'全体で上書きされ、\$array1の'language'は失われました。" . PHP_EOL; 55echo " - 'roles'は、\$array1と\$array2の要素が全て追加され、新しい数値キーが割り当てられました。" . PHP_EOL; 56echo " - 'status'と'last_login'は、それぞれ対応する元の配列から保持されました。" . PHP_EOL; 57echo PHP_EOL; 58 59// array_merge_recursive の使用例 60// array_merge_recursive は、文字列キーが重複する場合、その値がスカラ値であれば配列として両方の値を保持します。 61// 値が配列であれば、その配列を再帰的にマージします。 62// 数値添字配列(例: 'roles')は、array_merge と同様に要素が追加され、新しい数値キーが割り当てられます。 63echo "--- array_merge_recursive の結果 ---" . PHP_EOL; 64$recursiveMergedArray = array_merge_recursive($array1, $array2); 65var_dump($recursiveMergedArray); 66echo "備考:" . PHP_EOL; 67echo " - 'user_id'と'username'は、両方の値を持つ新しい配列になりました ([101, 102], ['alice', 'bob'])。" . PHP_EOL; 68echo " - 'preferences'は再帰的にマージされ、'theme'は両方の値を持つ配列になり、'language'と'notifications'は追加されました。" . PHP_EOL; 69echo " - 'roles'は、array_merge と同様に要素が全て追加され、新しい数値キーが割り当てられました。" . PHP_EOL; 70echo " - 'status'と'last_login'は、それぞれ対応する元の配列から保持されました。" . PHP_EOL; 71echo PHP_EOL; 72 73?>
PHP 8のarray_merge_recursive関数は、複数の配列を結合するための機能です。引数として任意の数の配列を受け取り、それらを結合した新しい配列を返します。この関数は、同じ文字列キーを持つ要素の扱いにおいて、array_merge関数と異なります。
array_mergeは、同じ文字列キーがあると後の配列の値で上書きし、ネストされた配列もそのキーが重複すると全体を置き換えてしまいます。一方array_merge_recursiveは、同じ文字列キーが存在する場合、その値が数値や文字列などの単一の値(スカラ値)であれば、両方の値を要素とする新しい配列を作成して保持します。さらに、値が配列である場合は、その配列を再帰的にマージ(結合)します。これにより、深い階層の配列構造も内容を失わずに結合することが可能です。ただし、数値添字配列(キーが数値の配列)の要素は、両関数とも単純に追加され、キーは再インデックスされます。ネストされた配列の内容を保持しつつ結合したい場合にarray_merge_recursiveが適しています。
array_merge_recursiveは、重複する文字列キーのスカラ値の場合、両方を配列として持ちます。これにより、user_idが配列になるなど意図しない多重配列になる可能性があるため注意が必要です。array_mergeでは、同じキーの値を後の配列で上書きします。ネストされた連想配列はarray_merge_recursiveで再帰的にマージされますが、数値添字配列は両関数とも要素を追加しキーは再割り当てとなります。キーの重複処理を理解し、目的に合わせて使い分けましょう。