Как объединить два или более массива в PHP без потери значений, если это один и тот же ключ и разные значения

У меня есть два многомерных массива. Мне нужно объединить эти два без потери значений, которые имеют один и тот же ключ и разные значения. Вот сценарий:

Array1
(
    [0] => 11
    [2] => 12
    [3] => 13
    [4] => (
                [0] =>  100
                [1] =>  200
            )
    [5] => 2
    [6] => 3
)

Array2
(
    [0] => 11
    [2] => 12
    [3] => 13
    [4] => (
                [0] =>  400
                [1] =>  500
            )
    [5] => 2
    [6] => 3
)

Результат должен быть

Result
(
    [0] => 11
    [2] => 12
    [3] => 13
    [4] => (
                [0] =>  (
                            [0] => 100
                            [1] => 400
                        )
                [1] =>  (
                            [0] => 200
                            [1] => 500
                        )
            )
    [5] => 2
    [6] => 3
)

person s1lam8u    schedule 19.06.2015    source источник
comment
Итак ... что вы пробовали до сих пор?   -  person Federkun    schedule 19.06.2015
comment
comment
это просто + оператор, а еще вопрос-дубликат))   -  person vitr    schedule 19.06.2015
comment
оба комментария неверны!   -  person codeneuss    schedule 19.06.2015
comment
Я пробовал. Если у меня есть ключ и значение в обоих массивах, он должен занимать только один индекс, ниже моего кода. $ ar1 = array (color = ›array (favourite =› red), 5); $ ar2 = array (10, color = ›array (favourite =› красный, синий)); $ result = array_merge_recursive ($ ar1, $ ar2); эхо ‹pre›; print_r ($ результат); эхо ‹/pre›   -  person s1lam8u    schedule 19.06.2015


Ответы (3)


Вот одно из решений:

<?php
$arrayA = array(0 => 11, 2 => 12, 3 => 13, 4 => array(0 => 100, 1 => array(0 => 222),), 5 => 2, 6 => 3);
$arrayB = array(
    0 => 11,
    2 => 12,
    3 => 13,
    4 => array(
        0 => 100,
        1 => array(0 => array(0 => 'test1', 1 => 'test2'), 1 => array(0 => 'test1', 1 => 'test2'),),
    ),
    5 => 2,
    6 => 3
);


/**
 * @param $a
 * @param $b
 * @return array
 */
function array_merge_graceful($a, $b)
{
    $c = [];
    if (is_array($a) && is_array($b)) {
        foreach (array_merge(array_keys($a),array_keys($b)) as $i) {
            if (!array_key_exists($i, $a)) {
                $c[$i] = $b[$i];
            } elseif (!array_key_exists($i, $b)) {
                $c[$i] = $a[$i];
            } else {
                $c[$i] = array_merge_graceful($a[$i], $b[$i]);
            }
        }
    } else {
        if ($a <> $b) {
            $c = [$a, $b];
        } else {
            $c = $a;
        }
    }
    return $c;
}

var_dump(array_merge_graceful($arrayA, $arrayB));

?>
person codeneuss    schedule 19.06.2015
comment
Это беспокоит ... Но этот сценарий не работает, пожалуйста, помогите мне. $ array1 = array (0 = ›11, 2 =› 12, 3 = ›13, 4 =› array (0 = ›100, 1 =› array (0 = ›222),), 5 =› 2, 6 = ›3); $ array2 = array (0 = ›11, 2 =› 12, 3 = ›13, 4 =› array (0 = ›100, 1 =› array (0 = ›array (0 =› 'test1', 1 = › 'test2'), 1 = ›массив (0 =› 'test1', 1 = ›'test2'),),), 5 =› 2, 6 = ›3); - person s1lam8u; 19.06.2015
comment
чего вы ожидаете в результате? - person codeneuss; 19.06.2015
comment
У меня есть ответ API, который дает кучу объектов из этого, несколько объектов с одним и тем же ключом и разными значениями, иногда с одним и тем же ключом и значением. Поэтому мне нужно объединить. Но проблема в том, что я не знаю, получу ли я 2-х мерное или 3-х мерное изображение. Иногда мне приходится объединять 3 массива. - person s1lam8u; 19.06.2015
comment
хорошо .. я понял ... попробуйте и скажите мне, работает ли это для вас. - person codeneuss; 19.06.2015

Попробуйте что-то вроде этого

<?php

$array1 = array(11, 12, 13, array(100, 200), 2, 3);
$array2 = array(11, 12, 13, array(400, 500), 2, 3);
echo "<pre>";
print_r($array1);
print_r($array2);

$combine = array();

foreach ($array1 as $key => $value) {
    if (array_key_exists($key, $combine)) {
        //if is array
        if (is_array($combine[$key])) {
            $combine[$key] = array($combine[$key], $value);
        }
    } else {
        $combine[$key] = $value;
    }
}

foreach ($array2 as $key => $value) {
    if (array_key_exists($key, $combine)) {
        //if is array
        if (is_array($combine[$key])) {
            $combine[$key] = array($combine[$key], $value);
        }
    } else {
        $combine[$key] = $value;
    }
}

echo "<hr>";
print_r($combine);
person Faiz Rasool    schedule 19.06.2015

используйте функцию array_merge_recursive () для слияния массивов. Для получения дополнительных сведений см. http://php.net/manual/en/function.array-merge-recursive.php

person sonam gupta    schedule 19.06.2015
comment
Если у меня есть ключ и значение в обоих массивах, он должен принимать только один индекс, ниже моего кода. $ ar1 = array (color = ›array (favourite =› red), 5); $ ar2 = array (10, color = ›array (favourite =› красный, синий)); $ result = array_merge_recursive ($ ar1, $ ar2); эхо ‹pre›; print_r ($ результат); эхо ‹/pre›; - person s1lam8u; 19.06.2015
comment
он может работать со строковыми ключами .. но не с целочисленными ключами ... я пробовал с массивами из вопроса ... это не всегда rtfm - person codeneuss; 19.06.2015