比较关联数组 - 返回不匹配的值

Posted

技术标签:

【中文标题】比较关联数组 - 返回不匹配的值【英文标题】:Compare Associative arrays - return unmatched values 【发布时间】:2014-09-11 14:42:11 【问题描述】:

我有 2 个关联数组,如下所示。

Array
(
    [Turbine] => 0
    [Nuts and Bolts] => 6
    [Runner Blade] => 5
)
Array
(
    [Nuts and Bolts] => 10
    [Runner Blade] => 5
    [Turbine] => 1
)

我想要做的是比较两个数组并返回具有相同键但值不同的数组。类似于array_intersect_assoc,但它返回所有匹配的值,这不是我想要的。使用上面的示例,我想要返回的是 2 个值之间的差异,例如:

Array
(
    [Nuts and Bolts] => 4
    [Turbine] => 1
)

【问题讨论】:

那么问题出在哪里?你有没有尝试过? 【参考方案1】:

类似这样的:

$ar1;
$ar2;

foreach ($ar1 as $k => $v) 
    if (intval($ar2[$k]) != intval($v))
        $ar1[$k] = abs($v - $ar2[$k]);
    else
        unset($ar1[$k]);    // remove key with equal value

【讨论】:

如何更改它以将结果保存到新数组中而不是修改现有数组?【参考方案2】:

试试这个...

$newArr = array();
foreach($arr1 as $k=>$v)
    $dif = abs($arr1[$k] - $arr2[$k]);
    if($dif) $newArr[$k] = $dif;

print '<pre>';
print_r($newArr);

【讨论】:

这行得通,但是我在$dif = abs($linequants[$k] - $costquants[$k]); 行得到一个未定义的索引错误 if(isset($linequants[$k], $costquants[$k])) $dif = abs($linequants[$k] - $costquants[$k]); if($dif) $newArr[$k] = $dif; 【参考方案3】:

这会做你想做的事:

array_intersect_key($array1, $array2)

【讨论】:

这里不测试值是否不同,也不减去两个数组中的值。 这只是返回第一个数组中存在于另一个数组中的值,而不是差异【参考方案4】:
$diff = array_diff_assoc($arr1, $arr2);

$result = array();

foreach(array_keys($diff) as $key)
    $result[$key] = abs($arr1[$key] - $arr2[$key]);


var_dump($result);

【讨论】:

以上是关于比较关联数组 - 返回不匹配的值的主要内容,如果未能解决你的问题,请参考以下文章

如何将pdo返回的关联数组的内容放入数组中

匹配数组项值并将新值分配给关联数组

php:如何通过键更新关联数组中的值

antd+vue3 多选框的值为对象数组

PHP:如何将一个数组中的键与另一个数组中的值进行比较,并返回匹配项?

PHP数组遍历详解