Я пытаюсь объединить следующие два массива в один массив, используя один и тот же ключ:
Первый массив:
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);
Если оба массива имеют одинаковое количество уровней и ключей, это должно работать:
$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);