Array-Merge на ассоциативном массиве в PHP - PullRequest
10 голосов
/ 25 июля 2011

Как я могу сделать array_merge для ассоциативного массива, например так:

Массив 1:

$options = array (
"1567" => "test",
"1853" => "test1",
);

Массив 2:

$option = array (
"none" => "N/A"
);

Так что мне нужно array_merge эти два, но когда я это сделаю, я получаю (в отладке):

Array
(
    [none] => N/A
    [0] => test
    [1] => test1
)

Ответы [ 7 ]

12 голосов
/ 25 июля 2011

Просто используйте $options + $option!

var_dump($options + $option);

выходы:

array(3) {
  [1567]=>
  string(4) "test"
  [1853]=>
  string(5) "test1"
  ["none"]=>
  string(3) "N/A"
}

Но будьте осторожны при столкновении клавиш. Вот что говорится в руководстве по PHP :

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

12 голосов
/ 25 июля 2011

попробуйте использовать:

$ finalArray = $ options + $ option .see http://codepad.org/BJ0HVtac Просто проверьте поведение дубликатов ключей, я не проверял это.Для уникальных ключей он отлично работает.

<?php

$options = array (
                  "1567" => "test",
                  "1853" => "test1",
                  );


$option = array (
"none" => "N/A"
);


$final = array_merge($option,$options);

var_dump($final);


$finalNew = $option + $options ;

var_dump($finalNew);

?>
1 голос
/ 25 июля 2011
$final_option = $option + $options;
1 голос
/ 25 июля 2011

Я хотел объединить два ассоциативных массива, добавив значения вместе, если ключи были одинаковыми. Если бы были ключи, уникальные для любого массива, они были бы добавлены в объединенный массив с их существующими значениями.

Я не смог найти функцию для этого, поэтому сделал это:

function array_merge_assoc($array1, $array2)
{

    if(sizeof($array1)>sizeof($array2))
    {
        echo $size = sizeof($array1);
    }
    else
    {
        $a = $array1;
        $array1 = $array2;
        $array2 = $a;

        echo $size = sizeof($array1);
    }

    $keys2 = array_keys($array2);

    for($i = 0;$i<$size;$i++)
    {
        $array1[$keys2[$i]] = $array1[$keys2[$i]] + $array2[$keys2[$i]];
    }

    $array1 = array_filter($array1);
    return $array1;
 }

Ссылка: http://www.php.net/manual/en/function.array-merge.php#90136

0 голосов
/ 11 октября 2016

Если массивы имеют одинаковые ключи, используйте array_merge_recursive()

$array1 = array( "a" => "1" , "b" => "45" );

$array2 = array( "a" => "23" , "b" => "33" );

$newarray = array_merge_recursive($array1,$array2);

array_merge_recursive() не перезаписывает, оно просто делает значение в виде массива.

0 голосов
/ 10 декабря 2013

Этот код может быть использован для рекурсивного слияния:

function merge($arr1, $arr2){
        $out = array();
        foreach($arr1 as $key => $val1){
            if(isset($arr2[$key])){
                if(is_array($arr1[$key]) && is_array($arr2[$key])){
                    $out[$key]=  merge($arr1[$key], $arr2[$key]);
                }else{
                    $out[$key]= array($arr1[$key], $arr2[$key]);
                }
                unset($arr2[$key]);
            }else{
                $out[$key] = $arr1[$key];
            }
        }
        return $out + $arr2;
 }
0 голосов
/ 25 июля 2011

когда array_merge не работает, тогда просто выполните

<?php
$new = array();
foreach ($options as $key=>$value) $new[$key] = $value;
foreach ($option as $key=>$value) $new[$key] = $value;
?>

или переключите два цикла foreach в зависимости от того, какой массив имеет более высокий приоритет

...