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
数组中的用户。