PHP将两个数组合并在同一个键AND值上 [英] PHP merge two arrays on the same key AND value
问题描述
我有两个数组.我想将它们合并在相同的键AND值上.如果它们具有相同的ur_user_id
,则将它们合并. array2
仅为array1
提供一些其他数据,因此new_array.length
= array1.length
. array1
只是从array2
获取其他数据.
I have two arrays. And I want to merge them on the same key AND value. If they have the same ur_user_id
then they are merged. array2
only provides some additional data for array1
, so the new_array.length
= array1.length
. array1
just gets the additional data from array2
.
$array1 =
array(
array('ur_user_id'=> 1,'ur_fname'=>'PerA','ur_lname'=>'SonA'),
array('ur_user_id'=> 2,'ur_fname'=>'PerB','ur_lname'=>'SonB'),
array('ur_user_id'=> 3,'ur_fname'=>'PerC','ur_lname'=>'SonC'),
);
$array2 =
array(
array('ur_user_id' => 5,'ur_code' => 'EE','ur_user_role' => 'testE'),
array('ur_user_id' => 4,'ur_code' => 'DD','ur_user_role' => 'testD'),
array('ur_user_id' => 6,'ur_code' => 'FF','ur_user_role' => 'testF'),
array('ur_user_id' => 3,'ur_code' => 'CC','ur_user_role' => 'testC'),
array('ur_user_id' => 1,'ur_code' => 'AA','ur_user_role' => 'testA'),
array('ur_user_id' => 2,'ur_code' => 'BB','ur_user_role' => 'testB'),
);
然后,新数组必须看起来像这样.它将同时具有array1
和array2
中的值.
Then the new array must look like this. It will have both the values from the array1
and array2
.
$new_array =
array(
array('ur_user_id'=> 1,'ur_fname'=>'PerA','ur_lname'=>'SonA','ur_code' => 'AA','ur_user_role' => 'testA'),
array('ur_user_id'=> 2,'ur_fname'=>'PerB','ur_lname'=>'SonB','ur_code' => 'BB','ur_user_role' => 'testB'),
array('ur_user_id'=> 3,'ur_fname'=>'PerC','ur_lname'=>'SonC','ur_code' => 'CC','ur_user_role' => 'testC'),
);
array1.length
始终小于或等于array2.length
,从不大于.并且两个数组的顺序将不会总是有序的.我已经尝试过下面的函数,但是对我来说它不起作用,并且对于循环我不是很好.
The array1.length
is always less than or equal to array2.length
never greater. And the order of both arrays will not be always ordered. I've tried the function below which I got somewhere here but it doesn't work for me and I'm not really good with loops.
function merge_common_keys(){
$arr = func_get_args();
$num = func_num_args();
$keys = array();
$i = 0;
for ($i=0; $i<$num; ++$i){
$keys = array_merge($keys, array_keys($arr[$i]));
}
$keys = array_unique($keys);
$merged = array();
foreach ($keys as $key){
$merged[$key] = array();
for($i=0; $i<$num; ++$i){
$merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null;
}
}
return $merged;
}
基于给定的数组,结果是这样的.它只会在同一键上合并.
Based on the given arrays the result is like this. It only merges on the same key.
Array
(
[0] => Array
(
[0] => Array
(
[ur_user_id] => 1
[ur_fname] => PerA
[ur_lname] => SonA
)
[1] => Array
(
[ur_user_id] => 5
[ur_code] => AA-BB-CC
[ur_user_role] => testE
)
)
推荐答案
尝试一下此代码,它可能会帮助您,它简短且没有遍历循环:
Try out this code, It might help you, it's short and without traversing loops:
usort($array2,function($a,$b){
return strnatcmp($a['ur_user_id'],$b['ur_user_id']);
});
$array3 = array_replace_recursive($array1, $array2);
$result = array_uintersect($array3,$array1,function($a,$b){
return strnatcmp($a['ur_user_id'],$b['ur_user_id']);
});
print_r($result);
输出
Array
(
[0] => Array
(
[ur_user_id] => 1
[ur_fname] => PerA
[ur_lname] => SonA
[ur_code] => AA
[ur_user_role] => testA
)
[1] => Array
(
[ur_user_id] => 2
[ur_fname] => PerB
[ur_lname] => SonB
[ur_code] => BB
[ur_user_role] => testB
)
[2] => Array
(
[ur_user_id] => 3
[ur_fname] => PerC
[ur_lname] => SonC
[ur_code] => CC
[ur_user_role] => testC
)
)
这是演示
这篇关于PHP将两个数组合并在同一个键AND值上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!