Проблема PHP array_merge - PullRequest
       3

Проблема PHP array_merge

1 голос
/ 26 октября 2010
$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
                )

        )

) 

Ответы [ 5 ]

9 голосов
/ 26 октября 2010

Поскольку ключ 'matches' в первом массиве перезаписывается тем же ключом во втором.Вместо этого вам нужно сделать следующее:

$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:

Ключи из первого массива будут сохранены.Если ключ массива существует в обоих массивах, то будет использоваться элемент из первого массива, а соответствующий элемент ключа из второго массива будет игнорироваться.

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

4 голосов
/ 26 октября 2010

Попробуйте использовать array_merge_recursive вместо array_merge.

0 голосов
/ 26 октября 2010

Попробуйте:

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

Ваша проблема в том, что вы объединяете массив $ a верхнего уровня с $ b, и оба имеют индекс «совпадения», поэтому он принимает версию этого элемента в $ b.Вы можете обойти это путем явного слияния в массиве этого индекса ($ a ['соответствия'] с $ b ['совпадениями']) и присвоения его объединенному массиву ($ merge ['совпадения']), что приведет кожидаемое поведение.

В качестве альтернативы array_merge_recursive будет делать то, что вы хотите.

0 голосов
/ 26 октября 2010

Вы объединяете верхний уровень массива.Функция array_merge() видит, что они оба содержат элемент «совпадения», поэтому выбирает один из них как объединенный результат.

Если вы хотите сканировать глубже, вам нужно запустить array_merge ()следующий уровень вниз в массиве.В этом случае это относительно просто, потому что у вас есть только один элемент на верхнем уровне каждого массива, поэтому вам потребуется только одна строка - что-то вроде этого:Впрочем, больше работы.

Надеюсь, это поможет.

0 голосов
/ 26 октября 2010

Ну, вы можете сделать это вручную:

    $mergedArray = array();    

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

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