PHP数组合并两个数组上相同的密钥
我想下面的两个数组合并成一个阵列,共享同一个密钥: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);
}
在理想情况下我会寻找格式化这两个数组的方式,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)
抛出一个错误:不支持的操作数类型(+ =) – 2014-09-22 08:31:47
我刚刚在PHP 5.5.14上测试了上面的代码,它工作正常。检查array_merge_recursive的输出是什么,它可能不是数组。 – DrBeza 2014-09-22 10:46:01
只是打败了我。 – 2013-02-12 21:43:43
我已经试过了,没有得到想要的结果。 – 2013-02-12 21:45:17
'array_merge_recursive()'的问题在于它仅适用于非数字键,因此首先必须将其转换为关联数组。 – 2013-02-12 21:51:54
如果两个阵列具有水平和密钥相同数量的这应该工作:
$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" }
}
像这样的东西应该工作:
$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);
主要问题是数组。由于它们的结构方式,将它们合并变得不必要地复杂。据他们仅仅是正常的关联数组(即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));
使用array_merge_recursive:
转换所有的数字键为字符串,(做是关联数组)
$result = array_merge_recursive($ar1, $ar2);
print_r($result);
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));
这对我有效。 我加入两个数组使用相同的按键
$array1 = ArrayUtils::merge($array1, $array2);
如果你需要保留NumericKey,使用
$array1 = ArrayUtils::merge($array1, $array2, true);
为了您的嵌套级别就足够了这一点:
$sumArray = array_map(function ($a1, $b1) { return $a1 + $b1; }, $array1, $array2);
对于较深嵌套它不会工作。
您能提供所需的输出吗? – HamZa 2013-02-12 21:36:45
欲望输出数组()camera1数组ip => xx.xx.xx.xx,名称=> VT等 – 2013-02-12 21:41:12
您是否从数据库中获取这些数组?如果是这样,那么也许有更好的方法来合并它们(即使用数据库的查询语言来做)。事实之后,这样合并它有点乏味。 – 2013-02-12 22:07:46