Подтвердить что ты не робот

PHP array_merge с числовыми ключами

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

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

[0] => 'whatever'

с

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

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

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

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

4b9b3361

Ответ 1

Используйте оператор +.

Сравните array_merge с +:

<?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 в этот случай создает новый ключ. Не желательно...

Ответ 2

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

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

Ответ 4

В моем проекте я использую свою собственную функцию

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

использование

$a = array_merge_custom($b, $c, $d, ... .. )

Ответ 5

Вы должны использовать $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 
) 

Ответ 6

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

Ответ 7

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

Ответ 8

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