PHP Array Verschmelzen Sie zwei Arrays auf demselben Schlüssel

Ich versuche, die folgenden zwei Arrays in ein Array zusammenzuführen, mit dem gleichen Schlüssel:

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

Zweites Array:

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

Wie Sie sehen können, teilen sie den gleichen Schlüssel (Camera1, Camera2, Camera3, etc ..)

Hier ist was ich versucht habe:

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

   

Idealerweise würde ich array_merge_recursive die beiden Arrays so zu formatieren, dass array_merge_recursive die Arrays einfach zusammenführt, ohne zu viel Aufwand.

Allerdings habe ich eine Lösung gefunden, die 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); 

Die Ausgabe ist:

 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) 

Versuchen Sie, array_merge_recursive zu verwenden.

Verwenden Sie array_merge_recursive:

Konvertiere alle numerischen Schlüssel in Strings, (make ist assoziatives Array)

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

Ref: http://php.net/array_merge_recursive

Für deine Verschachtelungsebene reicht das aus:

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

Für tieferes Verschachteln funktioniert es nicht.

Wenn beide Arrays die gleiche Anzahl von Ebenen und Schlüsseln haben, sollte dies funktionieren:

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

Am Ende sollte $ array3 etwa so aussehen:

 $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" } } 
 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 '
'; print_r(array_merge_custom($array1 , $array2));

Das Hauptproblem sind die Arrays. Aufgrund ihrer Struktur wird es unnötig kompliziert, sie zusammenzufassen. Es waren einfach normale assoziative Arrays (dh array('Camera1' => 'VT') dann wäre es mühelos, sie zusammenzuführen.

Ich würde vorschlagen, dass Sie herausfinden, wie Sie die Daten so formatieren, dass sie einfacher zu handhaben sind.

Dies ist eine schnelle und schmutzige Art, die beiden Arrays zusammenzuführen. Es nimmt eine “Kamera” von einem Array und versucht dann, die entsprechende “Kamera” in dem anderen Array zu finden. Die function verwendet nur die “Kameras” im $ips Array und verwendet nur die entsprechenden CameraN Tasten.

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

So etwas sollte funktionieren:

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

Das hat für mich funktioniert. Ich habe zwei Arrays mit denselben Schlüsseln verbunden

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

Wenn Sie NumericKey beibehalten möchten, verwenden Sie

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