8

I am trying to merge the following two arrays into one array, sharing the same key:

First Array:

array(3) {
  [0]=>
   array(1) {
   ["Camera1"]=>
   string(14) "192.168.101.71"
}
[1]=>
array(1) {
  ["Camera2"]=>
  string(14) "192.168.101.72"
}
[2]=>
array(1) {
  ["Camera3"]=>
  string(14) "192.168.101.74"
}
}

Second Array:

array(3) {
 [0]=>
  array(1) {
  ["Camera1"]=>
  string(2) "VT"
 }
 [1]=>
 array(1) {
   ["Camera2"]=>
   string(2) "UB"
 }
 [2]=>
 array(1) {
  ["Camera3"]=>
  string(2) "FX"
 }
}

As you can see, they share the same key (Camera1, Camera2, Camera3, etc..)

Here is what I have tried:

 $Testvar = array_merge($NewArrayCam,$IpAddressArray);
 foreach ($Testvar AS $Newvals){
 $cam = array();
 foreach($Newvals AS $K => $V){
 $cam[] = array($K => $V);
 }
rajthakur
  • 443
  • 6
  • 16
Matthew Colley
  • 10,816
  • 9
  • 43
  • 63

10 Answers10

11

Ideally I would look to format the two arrays in such a way that array_merge_recursive would simply merge the arrays without too much fuss.

However I did come up with a solution that used array_map.

$array1 = array(
    array("Camera1" => "192.168.101.71"),
    array("Camera2" => "192.168.101.72"),
    array("Camera3" => "192.168.101.74"),
);

$array2 = array(
    array("Camera1" => "VT"),
    array("Camera2" => "UB"),
    array("Camera3" => "FX")
);

$results = array();

array_map(function($a, $b) use (&$results) {

    $key = current(array_keys($a));
    $a[$key] = array('ip' => $a[$key]);

    // Obtain the key again as the second array may have a different key.
    $key = current(array_keys($b));
    $b[$key] = array('name' => $b[$key]);

    $results += array_merge_recursive($a, $b);

}, $array1, $array2);

var_dump($results);

The output is:

array (size=3)
  'Camera1' => 
    array (size=2)
      'ip' => string '192.168.101.71' (length=14)
      'name' => string 'VT' (length=2)
  'Camera2' => 
    array (size=2)
      'ip' => string '192.168.101.72' (length=14)
      'name' => string 'UB' (length=2)
  'Camera3' => 
    array (size=2)
      'ip' => string '192.168.101.74' (length=14)
      'name' => string 'FX' (length=2)
DrBeza
  • 2,241
  • 1
  • 16
  • 18
8

Try to use array_merge_recursive.

Peter Krejci
  • 3,182
  • 6
  • 31
  • 49
8

Use array_merge_recursive :

Convert all numeric key to strings, (make is associative array)

$result = array_merge_recursive($ar1, $ar2);
print_r($result);

Ref : http://php.net/array_merge_recursive

Prasanth Bendra
  • 31,145
  • 9
  • 53
  • 73
7

For your nesting level will be enough this:

$sumArray = array_map(function ($a1, $b1) { return $a1 + $b1; }, $array1, $array2);

For deeper nesting it wont work.

2

If both arrays have the same numbers of levels and keys this should work:

$array3 = array();

foreach ($array1 as $key1 => $value1) {
  // store IP
  $array3['Camera'.$key1]['IP'] = $value['Camera'.$key1]; 
  // store type of cam
  $array3['Camera'.$key1]['Type'] = $array2[$key]['Camera'.$key1]; 

}

At the end $array3 should be something like:

$array3 = array {

["Camera1"] => {['IP'] => "192.168.101.71", ['Type'] => "VT" }
["Camera2"] => {['IP'] => "192.168.101.72", ['Type'] => "UB" }
["Camera3"] => {['IP'] => "192.168.101.74", ['Type'] => "FX" }

}
Emil Orol
  • 593
  • 6
  • 20
2
this would be one of the soluion:

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 = array(
    array("Camera1" => "192.168.101.71"),
    array("Camera2" => "192.168.101.72"),
    array("Camera3" => "192.168.101.74"),
);

$array2 = array(
    array("Camera1" => "VT"),
    array("Camera2" => "UB"),
    array("Camera3" => "FX")
);
echo '<pre>';
print_r(array_merge_custom($array1 , $array2));
phvish
  • 149
  • 1
  • 8
0

Something like this should work:

$array1 = array(array("Camera1" => "192.168.101.71"), array("Camera2" => "192.168.101.72"), array("Camera3" => "192.168.101.74"));
$array2 = array(array("Camera1" => "VT"), array("Camera2" => "UB"), array("Camera3" => "FX"));
$results = array();

foreach($array1 as $key => $array){
  foreach($array as $camera => $value){
    $results[$camera]['ip'] = $value;
  }
}

foreach($array2 as $key => $array){
  foreach($array as $camera => $value){
    $results[$camera]['name'] = $value;
  }
}
print_r($results);
HamZa
  • 14,671
  • 11
  • 54
  • 75
0

The main problem are the arrays. Because of the way they are structured it becomes unnecessarily complicated to merge them. It they simply were normal associative arrays (i.e. array('Camera1' => 'VT') then it would be effortless to merge them.

I would suggest that you figure out how to format the data in such a way as to make it easier to work with.

This is a quick and dirty way of merging the two arrays. It takes one "camera" from one array, and then tries to find the corresponding "camera" in the other array. The function only uses the "cameras" in the $ips array, and only uses matching CameraN keys.

$ips = array(
    array('Camera1' => '192.168.101.71'),
    array('Camera2' => '192.168.101.72'),
    array('Camera3' => '192.168.101.74'),
);
$names = array(
    array('Camera1' => 'VT'),
    array('Camera2' => 'UB'),
    array('Camera3' => 'FX'),
);
function combineCameras($ips, $names) {
    $output = array();
    while ($ip = array_shift($ips)) {
        $ident = key($ip);
        foreach ($names as $key => $name) {
            if (key($name) === $ident) {
                $output[$ident] = array(
                    'name' => array_shift($name),
                    'ip' => array_shift($ip),
                );
                unset($names[$key]);
            }
        }
    }
    return $output;
}
var_dump(combineCameras($ips, $names));
Sverri M. Olsen
  • 13,055
  • 3
  • 36
  • 52
0

This worked for me. I joined two arrays with the same keys

$array1 = ArrayUtils::merge($array1, $array2);

If you need preserve NumericKey, use

$array1 = ArrayUtils::merge($array1, $array2, true);
0

You could convert all numeric keys to strings and use array_replace_recursive which:

merges the elements of one or more arrays together so that the values of one are appended to the end of the previous one. It returns the resulting array.

Example

$arr1 = [
    'rate' => 100   
];

$arr2 = [
    'rate' => 100,
    'name' => 'Best Name In Town',
];

print_r(array_replace_recursive($arr1, $arr2));

Output

Array
(
    [rate] => 100
    [name] => Best Name In Town
)
ii iml0sto1
  • 1,654
  • 19
  • 37