PHP 連想配列の配列(二次元配列)をマージするときのメモ

November 18, 2014

配列の配列や、ただの連想配列なら分かる。イメージしやすい。でも なぜか連想配列と多次元配列が徒党を組んで襲ってくると途端にイメージがしにくくなります。筆者だけではないと思いたい。分かりにくいことは忘れちゃうし、メモしておこうと思いました。

Image

この記事では、同じプロパティを持った複数のアイテムを例にします。以下の感じです。

最終的に構成したいデータ

1つのアイテムにつき 3つのプロパティを持つアイテム(連想配列)の配列です。

Array
(
    [0] => Array
        (
            [property1] => value
            [property2] => value
            [property3] => value
        )

    [1] => Array
        (
            [property1] => value
            [property2] => value
            [property3] => value
        )
)

各プロパティが別々の配列で与えられた場合

このアイテムを構成しようとしたとき、各プロパティが別々に与えられたとします。まとめて渡してくれればいいのに。データは常に こちらの都合が悪いように出来ている。

配列A – property1 と property2 を保持

Array
(
    [0] => Array
        (
            [property1] => value
            [property2] => value
        )

    [1] => Array
        (
            [property1] => value
            [property2] => value
        )
)

配列B – property3 を保持

Array
(
    [0] => Array
        (
            [property3] => value
        )

    [1] => Array
        (
            [property3] => value
        )
)

配列A と配列B をマージ(結合)するとき どうしたらよいか

PHP で配列をマージ(結合)する場合、2つの方法があるそうです。

上記 2つのリファレンスを読んでも正直、よく分からない。分かりたくない。脳が理解を拒否します。やってみればいいんだ。それが早い。

足し算(+ プラス演算子)する = array_merge() 関数を使う

配列A + 配列B の結果

Array
(
    [0] => Array
        (
            [property1] => value
            [property2] => value
        )

    [1] => Array
        (
            [property1] => value
            [property2] => value
        )
)

足されてないし。理由は考えない。考えたくない。ちなみに足し算の順番を変えると以下になります。

配列B + 配列A の結果

Array
(
    [0] => Array
        (
            [property3] => value
        )

    [1] => Array
        (
            [property3] => value
        )
)

2次元目以降の階層は単純に中身がそっくり上書きされるみたいですね。

array_merge_recursive() 関数を使う

array_merge_recursive( 配列A, 配列B ) の結果

Array
(
    [0] => Array
        (
            [property1] => value
            [property2] => value
        )

    [1] => Array
        (
            [property1] => value
            [property2] => value
        )

    [2] => Array
        (
            [property3] => value
        )

    [3] => Array
        (
            [property3] => value
        )
)

お、おう。もはやネタと思われても仕方ない。でも これが現実。

Google 先生、お願いします。

連想配列の配列(二次元配列)をマージする

本当にありがとうございます。こちらで紹介されているコードが答えでした。

最終的な結果とサンプル コードを掲載しておきます。KEINOS さんのコードから、渡す変数が配列かどうかをチェックしている部分を省いてしまいましたが、良い子はマネしちゃいけない。

(PHP)サンプル コード

function fArray_merge( $aOld, $aNew ){
	foreach($aNew as $sKey=>$mValue){
		if ( isset($aOld[$sKey]) && is_array($mValue) && is_array($aOld[$sKey])){
			$aOld[$sKey] = fArray_merge($aOld[$sKey], $mValue);
		} else {
			$aOld[$sKey] = $mValue;
		}
	}
    return($aOld);
}

$a = array();
$a[] = array(
	'property1' => 'value',
	'property2' => 'value'
);
$a[] = array(
	'property1' => 'value',
	'property2' => 'value'
);

$b = array();
$b[] = array( 'property3' => 'value' );
$b[] = array( 'property3' => 'value' );

$answer = fArray_merge( $a, $b );

print_r( $answer );

結果

Array
(
    [0] => Array
        (
            [property1] => value
            [property2] => value
            [property3] => value
        )

    [1] => Array
        (
            [property1] => value
            [property2] => value
            [property3] => value
        )
)

我ながらキレイにまとめました。
学生時代のノートもこれくらいキレイにしてたら もう少し良い成績だったかも知れない。

コメントを残す

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