Объединение массива PHP с числовыми ключами

как сделать так, чтобы array_merge () перезаписывал два ключа с разными значениями, но с одинаковым индексом ключа из двух массивов?

например, слияние:

[0] => 'whatever'

С

[0] => 'whatever', [1] => 'a', [2] => 'b'

должно производить

[0] => 'whatever', [1] => 'a', [2] => 'b'

В основном я хочу, чтобы array_merge bahave так же, как он ведет себя, если массивы имеют строковые ключи...

8 ответов


использовать + оператора.

сравнить array_merge to + оператор:

<?php

$a1 = array(0=>"whatever",);
$a2 = array(0=>"whatever",1=>"a",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

выход:

Array
(
    [0] => whatever
    [1] => whatever
    [2] => a
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

на + оператор еще работает, если ваш ассоциативный массив имеет числовые ключи вне порядка:

<?php

$a1 = array(0=>"whatever",);
$a2 = array(1=>"a",0=>"whatever",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

выход:

Array
(
    [0] => whatever
    [1] => a
    [2] => whatever
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

обратите внимание array_merge на этой case создает новый ключ. Не желательный...


довольно легко писать вручную:

function array_merge_custom($first, $second) {
    $result = array();
    foreach($first as $key => $value) {
        $result[$key] = $value;
    }
    foreach($second as $key => $value) {
        $result[$key] = $value;
    }

    return $result;
}

обновление: это ведет себя иначе, чем оператор объединения (return $first + $second;), поскольку в этом случае второй массив выигрывает, когда оба имеют элементы с одним и тем же ключом.

однако, если вы переключаете места аргументов и размещаете массив, который вы хотите "выиграть" в случае конфликтов, как первый операнд, вы можете получить такое же поведение. Таким образом, функция выше ведет себя точно так же return $second + $first;.


array_replace делает именно это. Смотри:http://php.net/manual/de/function.array-replace.php


function array_merge_custom()
{
    $array      = array();
    $arguments  = func_num_args();
    foreach($arguments as $args)
        foreach($args as $key => $value)
            $array[$key] = $value;
    return $array;
}

вы должны использовать $a2+$a1 чтобы получить тот же результат с array_merge($a1,$a2);

$a1 = array(
    'k1' => 1,
    'k2' => 2,
    'k3' => 3,
);

$a2 = array(
    'k1' => 11,
    'k2' => 22,
    'k4' => 44,
);

код:

print_r(array_merge($a1,$a2));

выход:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k3] => 3 
    [k4] => 44 
)

код:

print_r($a1+$a2);

выход:

Array ( 
    [k1] => 1 
    [k2] => 2 
    [k3] => 3 
    [k4] => 44 
)

код:

print_r($a2+$a1);

выход:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k4] => 44 
    [k3] => 3 
) 

можно использовать array_merge() и затем использовать array_unique().


the solution could be this:
function array_merge_custom($array1, $array2) {
    $mergeArray = [];
    $array1Keys = array_keys($array1);
    $array2Keys = array_keys($array2);
    $keys = array_merge($array1Keys, $array2Keys);

    foreach ($keys as $key) {
        $mergeArray[$key] = array_merge_recursive(isset($array1[$key]) ? $array1[$key] : [], isset($array2[$key]) ? $array2[$key] : []);
    }

    return $mergeArray;
}

$array1 = [
    '66_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '67_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '68_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    68 => [
        'k1' => 1,
        'k2' => 1,
    ]
];
$array2 = [
    '66_' => [
        'a1' => 1,
        'a2' => 1,
    ],
    '68_' => [
        'b1' => 1,
        'b2' => 1,
    ],
    68 => [
        'b1' => 1,
        'b2' => 1,
    ]
];
echo '<pre>';
print_r(array_merge_custom($array1, $array2));

$arrA = [10, 11, 12];
$arrB = [12, 13];

$arrCommon = array_keys(array_flip($arrA) + array_flip($arrB));

print_r($arrCommon);
Array
(
    [0] => 10
    [1] => 11
    [2] => 12
    [3] => 13
)

сравнить неправильно использование "+"

$arrCommon = $arrA + $arrB;

print_r($arrCommon);
Array
(
    [0] => 10
    [1] => 11
    [2] => 12
)