使用array_diff比较两个关联数组

5

我对array_diff的行为感到困惑

为什么类型在diff数组中不存在?你知道如何解决这个问题吗?

-代码

<?php
$array1 = array
(
    'value01' => '0',
    'value02' => 'v2',
    'genre' => '1',
    'type' => 'text',
    'contry' => 'us',
    'data' => '1',
);
$array2 = array
(
    'value01' => 'v1',
    'value02' => 'v2',
    'genre' => '0',
    'type' => 'text',
    'contry' => 'canada',
    'data' => '1',
);

print_r(array_diff($array1,$array2));

我的成果:

Array
(
    [contry] => us
)

但我期望:

Array
(
    [value01] => 0,
    [genre] => 1,
    [contry] => us,
);
3个回答

18

这个答案并不十分慷慨,也不能使得这个页面成为一个优秀的重复目标。 - mickmackusa

5
array_diff 操作数组的值,忽略键。
因为第一个数组中 genre 的值是 1,这意味着如果第二个数组中的任何键有值为 1,则会从第一个数组中删除 genre 键。
看一下没有键的数组,你就会明白我的意思了。你基本上有两个值列表,['0','v2','1','text','us','1']['v1','v2','0','text','canada','1']。第一个列表中唯一不在第二个列表中出现的值是 'us'
我猜你可能想看看 array_key_diff()array_diff_assoc()

0

array_diff_assoc会在多层次关联数组的情况下引发数组转换异常,例如以下这些数组:

  "ip" => "127.0.0.1"
  "uri" => "follows/count"
  "body" => array:1 [
    "user_id" => 4473
  ]

针对这些类型,我已经创建了一个通用的自定义函数,您可以使用它:
function mutidimensional_arrays_are_same(array $baseArray, array $compareArray)
{
    try {
        foreach ($baseArray as $key => $value) {
            if (is_array($value) && isset($compareArray[$key]) && is_array($compareArray[$key])) {
                return mutidimensional_arrays_are_same($value, $compareArray[$key]);
            } else {
                if ($value != $compareArray[$key]) {
                    return false;
                }
            }
        }
        return true;
    } catch (Exception $err) {
        return !str_starts_with($err->getMessage(), 'Undefined ');
    }
}

array_diff_assoc不同,它返回boolean


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接