2013-02-12 164 views
3

我想下面的兩個數組合併成一個陣列,共享同一個密鑰: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

回答

8

在理想情況下我會尋找格式化這兩個數組的方式,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

9

嘗試使用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

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

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

使用array_merge_recursive:

轉換所有的數字鍵爲字符串,(做是關聯數組)

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

編號:http://php.net/array_merge_recursive

1
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

這對我有效。 我加入兩個數組使用相同的按鍵

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

如果你需要保留NumericKey,使用

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

爲了您的嵌套級別就足夠了這一點:

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

對於較深嵌套它不會工作。