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);

The result of this script is

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

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

        )

)

But why?

I want the result was this:

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

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

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

        )

) 

5 Answers 5

9

Because the key 'matches' in the first array is being overwritten by the same key in the second. You need to do this instead:

$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);

UPDATE

In order to preserve the numeric keys, you'll have to do this:

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

If using the array union operator like this, just remember the following from php.net:

The keys from the first array will be preserved. If an array key exists in both arrays, then the element from the first array will be used and the matching key's element from the second array will be ignored.

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

Sign up to request clarification or add additional context in comments.

4 Comments

how i can save a "key" matches? need "5,15,25,35", but have "0,1,2,3"
You'll have to stop using array_merge. According to PHP docs, array_merge will always renumber numeric keys, even if you try using numbers in strings like array('1' => 'something', '2' => 'something');. In order to preserve keys, you'll have to use a + array union. I'll update my answer.
@Isis: Cool function! Useful for when you don't know the array's structure. But I would recommend a more surgical approach when you know exactly what structure you have, like in the problem at hand.
4

Try using array_merge_recursive instead of array_merge.

Comments

0

Well, you could do it manually:

    $mergedArray = array();    

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

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

1 Comment

This will result in the exact same problem the original poster already has. In fact, he would get identical output to what he suggested he was trying to fix.
0

You're merging the top-level of the array. The array_merge() function is seeing that they both contain a "matches" element, so it is picking one as the merged result.

If you want it to scan deeper, you need to run array_merge() at the next level down in the array. In this case it's relatively simple because you only have one element at the top level of each array, so you'd only need a single line - Something like this:

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

A more complex array structure would need more work, though.

Hope that helps.

Comments

0

Try:

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

Your problem is that you are merging the top level $a array with $b and both of these have a "matches" index so it's accepting $b's version of that element. You can get around this by explicitly merging in that index's array ($a['matches'] with $b['matches']) and assigning it to the merged array ($merge['matches']) which will result in the expected behavior.

Alternatively array_merge_recursive will do what you want.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.