1
$a = array('matches' => 
        array(
            '5' => array('weight' => 6),
            '15' => array('weight' => 6),
        )
    );

    $b = array('matches' => 
        array(
            '25' => array('weight' => 6),
            '35' => array('weight' => 6),
        )
    );

    $merge = array_merge($a, $b);

    print_r($merge);

このスクリプトの結果は

Array
(
    [matches] => Array
        (
            [25] => Array
                (
                    [weight] => 6
                )

            [35] => Array
                (
                    [weight] => 6
                )

        )

)

しかし、なぜ?

私は結果がこれであったことを望みます:

Array
(
    [matches] => Array
        (
            [5] => Array
                (
                    [weight] => 6
                )

            [15] => Array
                (
                    [weight] => 6
                )
            [25] => Array
                (
                    [weight] => 6
                )

            [35] => Array
                (
                    [weight] => 6
                )

        )

) 
4

5 に答える 5

9

最初の配列のキー'matches'が 2 番目の配列の同じキーによって上書きされているためです。代わりにこれを行う必要があります:

$merge = array('matches' => array());
$a = array(
    'matches' => array(
        '5' => array('weight' => 6),
        '15' => array('weight' => 6)
    )
);

$b = array(
    'matches' => array(
        '25' => array('weight' => 6),
        '35' => array('weight' => 6)
    )
);

$merge['matches'] = array_merge($a['matches'], $b['matches']);

print_r($merge);

アップデート

数字キーを保持するには、次のようにする必要があります。

$merge['matches'] = $a['matches'] + $b['matches'];

このように配列ユニオン演算子を使用する場合は、php.net の次のことを覚えておいてください。

最初の配列のキーは保持されます。配列キーが両方の配列に存在する場合、最初の配列の要素が使用され、2 番目の配列の一致するキーの要素は無視されます。

http://php.net/manual/en/function.array-merge.php

于 2010-10-25T21:30:25.310 に答える
4

array_merge_recursiveの代わりに使用してみてくださいarray_merge

于 2010-10-25T21:31:47.823 に答える
0

試す:

$merge = array();
$merge['matches'] = array_merge($a['matches'], $b['matches']);

問題は、最上位の$a配列を$bとマージしていて、両方に「一致」インデックスがあるため、その要素の$bのバージョンを受け入れていることです。これを回避するには、そのインデックスの配列($a['matches']と$b['matches'])を明示的にマージし、マージされた配列($ merge ['matches'])に割り当てます。予想される行動。

または、 array_merge_recursiveが必要な処理を実行します。

于 2010-10-25T21:31:35.187 に答える
0

まあ、あなたはそれを手動で行うことができます:

    $mergedArray = array();    

    foreach($a as $key => $value)
    {
        $mergedArray[$key] = $value;
    }

    foreach($b as $key => $value)
    {
        $mergedArray[$key] = $value;
    }
于 2010-10-25T21:30:01.143 に答える
0

配列の最上位をマージしています。関数は、array_merge()両方に「一致」要素が含まれていることを確認しているため、マージ結果としていずれかを選択しています。

より深くスキャンしたい場合は、配列の次のレベルで array_merge() を実行する必要があります。この場合、各配列の最上位レベルに要素が 1 つしかないため、比較的単純です。したがって、必要な行は 1 行だけです。次のようなものです。

$merge['matches'] = array_merge($a['matches'], $b['matches']);

ただし、より複雑な配列構造には、より多くの作業が必要になります。

それが役立つことを願っています。

于 2010-10-25T21:30:15.123 に答える