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

PHP数组在同一个键上合并两个数组,php,arrays,Php,Arrays,我正在尝试将以下两个数组合并为一个数组,共享同一个密钥: 第一个数组: 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) "1

我正在尝试将以下两个数组合并为一个数组,共享同一个密钥:

第一个数组:

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"
 }
}
第二个数组:

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

尝试使用。

如果两个数组的级别和键数相同,则应该可以:

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

}
$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);
最后,$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" }

}

像这样的方法应该会奏效:

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

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

主要问题是阵列。由于它们的结构方式,合并它们变得不必要的复杂。如果它们只是普通的关联数组(即
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));

理想情况下,我希望将这两个数组的格式设置为
array\u merge\u recursive
可以简单地合并数组,而不会太麻烦

然而,我确实提出了一个使用
array\u 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)

使用数组\合并\递归:

将所有数字键转换为字符串(生成关联数组)

参考:

这将是解决方案之一:
函数数组\合并\自定义($array1,$array2){
$mergeArray=[];
$array1Keys=数组_键($array1);
$array2Keys=数组_键($array2);
$keys=array\U merge($array1Keys,$array2Keys);
foreach($key作为$key){
$MERGEARRY[$key]=数组合并递归(isset($array1[$key])?$array1[$key]:[],isset($array2[$key])?$array2[$key]:[]);
}
返回$mergeArray;
}
$array1=数组(
阵列(“Camera1”=>“192.168.101.71”),
阵列(“Camera2”=>“192.168.101.72”),
阵列(“Camera3”=>“192.168.101.74”),
);
$array2=数组(
阵列(“Camera1”=>“VT”),
阵列(“Camera2”=>“UB”),
阵列(“Camera3”=>“FX”)
);
回声';
打印(数组合并自定义($array1,$array2));
这对我很有效。 我用相同的键连接了两个数组

$array1 = ArrayUtils::merge($array1, $array2, true);
如果需要保留NumericKey,请使用


对于您的嵌套级别来说,这就足够了:

$sumArray=array\u映射(函数($a1,$b1){return$a1+$b1;},$array1,$array2);


对于更深层的嵌套,它不起作用。

您能提供所需的输出吗?desire output array()camera1 array ip=>xx.xx.xx,name=>VT,等等您从数据库获取这些数组吗?如果是这样,也许有更好的方法合并它们(即使用数据库的查询语言进行合并)。像这样合并它,在事实发生之后,有点乏味。这比我更重要。
array\u merge\u recursive()
的问题是它只对非数字键有效,所以首先你必须将它转换为关联数组。我同意,
array\u merge\u recursive()
绝对不适用于此数据。引发错误:不支持的操作数类型(+=)我刚刚在PHP 5.5.14上测试了上面的代码,效果很好。请检查array\u merge\u recursive的输出,它可能不是数组。请记住,只有在使用Zend Framework时,这才有效。