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

Второй массив:

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

В идеале я бы хотел отформатировать два массива таким образом, чтобы 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) 

Попробуйте использовать array_merge_recursive .

Использовать array_merge_recursive:

Преобразуйте все числовые ключи в строки, (make – ассоциативный массив)

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

Ссылка: http://php.net/array_merge_recursive

Если оба массива имеют одинаковое количество уровней и ключей, это должно работать:

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

Для вашего уровня гнездования будет достаточно:

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

Для более глубокого гнездования это не сработает.

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

Основная проблема – массивы. Из-за того, как они структурированы, становится излишне сложным объединить их. Это они просто были нормальными ассоциативными массивами (т.е. 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)); не $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)); 

Что-то вроде этого должно работать:

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

Это сработало для меня. Я присоединился к двум массивам с теми же ключами

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

Если вам нужно сохранить NumericKey, используйте

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