array_diff有计算

array_diff with calculation

请考虑以下数组:

$reference = array(
    '080604' => 4,
    '080703' => 4,
    '080734' => 2,
    '080819' => 2,
    '088341' => 2,
    '805238' => 20,
    '805283' => 4,
    '805290' => 2,
    '805849' => 2,
    '806051' => 2,
    '806068' => 2,
);

$test = array(
    '080604' => 2,
    '080703' => 4,
    '080819' => 1,
    '088341' => 2,
    '805238' => 20,
    '805283' => 4,
    '805290' => 2,
    '805849' => 2,
    '806051' => 2,
    '806068' => 2,
);

它们非常相似,但也有一些不同之处,例如有可能: - $reference 的某些键根本不存在于 $test 中 - $test 的某些键根本不存在于 $reference 中 - 所有键都存在,但 $reference 和 $test 中的值不同(有时 $reference 值大于 $test,有时 $test 值大于 $reference)

我需要自动找出差异并以某种方式输出它们,不仅是计数本身的差异,而且还提供了描述,例如

$result = [
   '080604' => [
       'reference' => 4,
       'test' => 2
   ]
];

如果某个值仅在其中一个列表中:

$result = [
   '1234567890' => [
       'reference' => 0,
       'test' => 2
   ]
];

或类似的东西。

有没有人有想法,以优雅的方式完成此任务的最佳方式是什么?非常感谢!

遍历每个并用值填充数组(如果存在):

$combined = [];

foreach ($reference as $key => $val) {
    $combined[$key] = [
        'test' => 0,
        'reference' => $val,
    ];
}

foreach ($test as $key => $val) {
    if (!isset($combined[$key])) {
        $combined[$key] = [
            'reference' => 0,
            'test' => 0,
        ]
    }

    $combined[$key]['test'] = $val;
}

$combined 将包含两个数组中的两个值,同时引用 $reference$test.

中的元素

尝试

$result = array_diff($reference, $test);
print_r($result)