Array-Merge on an associative array in PHP
Asked Answered
W

7

13

How can i do an array_merge on an associative array, like so:

Array 1:

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

Array 2:

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

So i need to array_merge these two but when i do i get this (in debug):

Array
(
    [none] => N/A
    [0] => test
    [1] => test1
)
Wholly answered 25/7, 2011 at 9:11 Comment(2)
"Values in the input array with numeric keys will be renumbered with incrementing keys starting from zero in the result array.". If you can change your $options array keys to contain some string, then it will work just fine.Jock
@Shef: You should mention: Non-Numeric strings.Trefoil
J
14

try using :

$finalArray = $options + $option .see http://codepad.org/BJ0HVtac Just check the behaviour for duplicate keys, I did not test this. For unique keys, it works great.

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

?>
Jimmy answered 25/7, 2011 at 9:17 Comment(1)
Also remember that after merge the keys will be "0" and "1". array_merge() function resets numeric keys!Tamaru
O
11

Just use $options + $option!

var_dump($options + $option);

outputs:

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

But be careful when there is a key collision. Here is what the PHP manual says:

The keys from the first array will be preserved. If an array key exists in both arrays, then the element from the first array will be used and the matching key's element from the second array will be ignored.

Obstipation answered 25/7, 2011 at 9:22 Comment(0)
J
2
$final_option = $option + $options;
Jerkwater answered 25/7, 2011 at 9:24 Comment(0)
C
1

I was looking to merge two associative arrays together, adding the values together if the keys were the same. If there were keys unique to either array, these would be added into the merged array with their existing values.

I couldnt find a function to do this, so made this:

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

Reference: http://www.php.net/manual/en/function.array-merge.php#90136

Cykana answered 25/7, 2011 at 9:15 Comment(0)
H
0

when array_merge doesn't work, then simply do

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

or switch the two foreach loops depending on which array has higher priority

Harwilll answered 25/7, 2011 at 9:14 Comment(0)
S
0

This code could be used for recursive merge:

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;
 }
Strafford answered 10/12, 2013 at 8:4 Comment(0)
A
0

If arrays having same keys then use array_merge_recursive()

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

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

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

The array_merge_recursive() wont overwrite, it just makes the value as an array.

Abubekr answered 11/10, 2016 at 15:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.