PHP合并两个数组并合并两个数组的不同值,数组合并不';行不通
我想合并两个数组,它们可能共享或不共享相同的值,也可能具有或不具有相同的键 如果两个数组中都存在一个键,我希望合并这两个值。如果一个键在另一个中不存在,我想将它添加到数组中,添加缺少的键/值 在下面的示例中,PHP合并两个数组并合并两个数组的不同值,数组合并不';行不通,php,arrays,Php,Arrays,我想合并两个数组,它们可能共享或不共享相同的值,也可能具有或不具有相同的键 如果两个数组中都存在一个键,我希望合并这两个值。如果一个键在另一个中不存在,我想将它添加到数组中,添加缺少的键/值 在下面的示例中,数组A和数组B共享一个公共用户密钥 但是阵列A具有已取数KVP,而阵列B具有释放数KVP 我想要一个使用user\u键KVP作为数组键的新数组。如果一个KVP存在于一个数组中,但不存在于另一个数组中,我想将其添加到“user_key”中 您可以看到用户1111在两个数组中,因此他的user\
数组A
和数组B
共享一个公共用户密钥
但是阵列A
具有已取数
KVP,而阵列B
具有释放数
KVP
我想要一个使用user\u键
KVP作为数组键的新数组。如果一个KVP存在于一个数组中,但不存在于另一个数组中,我想将其添加到“user_key”中
您可以看到用户1111在两个数组中,因此他的user\u name
、take\u count
和release\u count
被添加到新数组中
数组B中不存在人员B,因此将人员B添加到新数组中,并将release\u count
KVP添加为0
C也一样
我尝试了数组_merge _recursive的多种变体,但它没有添加缺少的键
我使用下面的foreach
循环遍历所有已发布的调用,然后使用另一个foreach
循环遍历所有已执行的调用。但是缺少一些KVP
foreach ($calls_released_by_user as $key=>$value){
$user_name = array_key_exists($key, $calls_taken_by_user) ? $calls_taken_by_user[$key]['user_name'] : 0
$taken_count = array_key_exists($key, $calls_taken_by_user) ? $calls_taken_by_user[$key]['taken_count'] : 0;
$release_count = array_key_exists($key, $calls_released_by_user) ? $calls_released_by_user[$key]['release_count'] : 0;
$all_user_calls_counts[$key] = array( 'user_name'=>$value['user_name'],
'taken_count' => $taken_count,
'release_count' => $release_count);
}
数组A
[0]=>
{
["user_key"] => "1111"
["user_name"] => "A Person"
["taken_count"] => "10"
}
[1]=>
{
["user_key"] => "2222"
["user_name"] => "B Person"
["taken_count"] => "20"
}
阵列B
[0]=>
{
["user_key"] => "1111"
["user_name"] => "A Person"
["release_count"] => "5"
}
[1]=>
{
["user_key"] => "3333"
["user_name"] => "C Person"
["release_count"] => "50"
}
使用用户密钥作为新密钥的组合数组
[1111]=>
{
["user_name"] => "A Person"
["release_count"] => "5"
["taken_count"] => "10"
}
[2222]=>
{
["user_name"] => "B Person"
["taken_count"] => "20"
["release_count"] => "0"
}
[3333]=>
{
["user_name"] => "C Person"
["taken_count"] => "0"
["release_count"] => "50"
}
array\u key\u存在($key$calls\u由用户执行)
不正确。这将检查另一个数组中的数组索引,但这两个数组没有按索引对应的元素
您应该将第二个数组转换为由user\u key
设置关键帧的关联数组。然后,您可以轻松地搜索两个数组之间的匹配元素并合并它们
$assoc_calls_taken = [];
foreach ($calls_taken_by_user as $el) {
$assoc_calls_taken[$el['user_id']] = $el;
}
foreach ($calls_released_by_user as $el) {
$user = $el['user_key'];
$all_user_calls_counts[$user] = $el;
$all_user_calls_counts[$user]['release_count'] = isset($assoc_calls_take[$user])) ? $$assoc_calls_take[$user]['release_count']) : 0;
}
只需依次迭代两个数组:
$all_user_calls_counts = [];
foreach ($calls_taken_by_user as $taken) {
$all_user_calls_counts[$taken['user_key']] = [
'user_name' => $taken['user_name'],
'taken_count' => $taken['taken_count'],
'release_count' => '0'
];
}
foreach ($calls_released_by_user as $released) {
$key = $released['user_key'];
if (isset($all_user_calls_counts[$key])) {
$all_user_calls_counts[$key]['release_count'] = $released['release_count'];
continue;
}
$all_user_calls_counts[$key] = [
'user_name' => $released['user_name'],
'taken_count' => '0',
'release_count' => $released['release_count']
];
}
通过数组分解(在一个命令中将字段分配给变量),您可以使代码更具可读性,但我不知道您使用的是哪个php版本。您还必须通过
调用_take
数组来获取出现在那里但不在调用_relased
中的所有用户。现在,在all\u users\u calls\u counts
中,只有出现在calls\u released
数组中的用户。