在同一键上合并两个PHP数组

8
我将尝试将以下两个数组合并为一个数组,并共享相同的键:
第一个数组:
```html ```
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"
}
}

第二个数组:

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

正如你所看到的,它们共享相同的键(Camera1,Camera2,Camera3等)

以下是我尝试过的:

 $Testvar = array_merge($NewArrayCam,$IpAddressArray);
 foreach ($Testvar AS $Newvals){
 $cam = array();
 foreach($Newvals AS $K => $V){
 $cam[] = array($K => $V);
 }

4
请提供所需的输出。 - HamZa
期望的输出数组() camera1 数组 IP => xx.xx.xx.xx,名称 => VT,等等 - Matthew Colley
你是从数据库中获取这些数组吗?如果是的话,也许有更好的方法来合并它们(例如使用数据库的查询语言)。事后这样合并有点繁琐。 - Sverri M. Olsen
10个回答

11
理想情况下,我希望以这样的方式格式化这两个数组,使得array_merge_recursive能够简单地合并这些数组而不需要太多的麻烦。
不过,我想出了一个使用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);

输出结果为:

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)

抛出错误:不支持的操作数类型(+=) - Jonathan
1
我刚在 PHP 5.5.14 上测试了上面的代码,它可以正常工作。请检查 array_merge_recursive 的输出,它可能不是一个数组。 - DrBeza

8

1
刚好比我快一步。 - Arnold Daniels
6
array_merge_recursive() 函数的问题在于它仅适用于非数字键,因此首先您需要将其转换为关联数组。 - Peter Krejci
我同意,array_merge_recursive() 绝对不适用于这个数据。 - mickmackusa

8
使用array_merge_recursive:
将所有数字键转换为字符串(使其成为关联数组)
$result = array_merge_recursive($ar1, $ar2);
print_r($result);

Ref : http://php.net/array_merge_recursive


7

对于您的嵌套级别,以下代码足够使用:

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

但是对于更深层次的嵌套,它将无法正常工作。


2
如果两个数组具有相同数量的层级和键,则应该可以使用以下方法:

如果两个数组具有相同数量的层级和键,这个方法就可以工作:

$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]; 

}

最终,$array3应该是这样的:

$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" }

}

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

0

你可以将所有数字键转换为字符串,并使用array_replace_recursive,该函数:

将一个或多个数组的元素合并在一起,以使其中一个的值附加到前一个的末尾。它返回结果数组。

示例

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

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

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

输出

Array
(
    [rate] => 100
    [name] => Best Name In Town
)

0

这对我起作用了。 我用相同的键合并了两个数组

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

如果需要保留数字键,请使用

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

2
请记住,只有在使用Zend Framework时才能正常工作。 - Mugur 'Bud' Chirica

0

应该可以这样做:

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

0
主要问题在于数组。由于它们的结构方式,合并它们变得不必要地复杂。如果它们只是普通的关联数组(即array('Camera1' => 'VT')),那么合并它们将变得轻而易举。
我建议您想办法以使数据格式化更容易处理。
这是一种快速而简单的合并两个数组的方法。它从一个数组中取出一个“相机”,然后尝试在另一个数组中找到相应的“相机”。该函数仅使用$ips数组中的“相机”,并仅使用匹配的CameraN键。
$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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接