PHP数组合并两个数组上相同的密钥

问题描述:

我想下面的两个数组合并成一个阵列,共享同一个密钥:PHP数组合并两个数组上相同的密钥

第一个数组:

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 2013-02-12 21:36:45

+0

欲望输出数组()camera1数组ip => xx.xx.xx.xx,名称=> VT等 – 2013-02-12 21:41:12

+0

您是否从数据库中获取这些数组?如果是这样,那么也许有更好的方法来合并它们(即使用数据库的查询语言来做)。事实之后,这样合并它有点乏味。 – 2013-02-12 22:07:46

在理想情况下我会寻找格式化这两个数组的方式,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) 
+0

抛出一个错误:不支持的操作数类型(+ =) – 2014-09-22 08:31:47

+1

我刚刚在PHP 5.5.14上测试了上面的代码,它工作正常。检查array_merge_recursive的输出是什么,它可能不是数组。 – DrBeza 2014-09-22 10:46:01

尝试使用array_merge_recursive

+1

只是打败了我。 – 2013-02-12 21:43:43

+0

我已经试过了,没有得到想要的结果。 – 2013-02-12 21:45:17

+4

'array_merge_recursive()'的问题在于它仅适用于非数字键,因此首先必须将其转换为关联数组。 – 2013-02-12 21:51:54

如果两个阵列具有水平和密钥相同数量的这应该工作:

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

} 

像这样的东西应该工作:

$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_merge_recursive:

转换所有的数字键为字符串,(做是关联数组)

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

编号:http://php.net/array_merge_recursive

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

这对我有效。 我加入两个数组使用相同的按键

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

如果你需要保留NumericKey,使用

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

为了您的嵌套级别就足够了这一点:

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

对于较深嵌套它不会工作。