PHP Array将两个数组合并在同一个键上
我想将下面的两个数组合并到一个数组中,共享相同的键:
第一arrays:
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" } }
第二arrays:
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
的解决scheme。
$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:
将所有数字键转换为string,(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')
那么合并它们将是毫不费力的。
我build议你弄清楚如何格式化数据,以便更容易处理。
这是合并两个数组的快速和肮脏的方法。 它从一个arrays中取出一个“相机”,然后尝试在另一个arrays中find相应的“相机”。 该function只使用$ips
数组中的“cameras”,并且只使用匹配的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));
像这样的东西应该工作:
$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);
这对我有效。 我用相同的键join了两个数组
$array1 = ArrayUtils::merge($array1, $array2);
如果您需要保留NumericKey,请使用
$array1 = ArrayUtils::merge($array1, $array2, true);