获取两个关联数组之间的关联差异

问题描述 投票:0回答:3

我有 2 个要比较的数组。在 A 面,它包含分成不同列的 IPtables 规则。 输出数组 A 示例;

Array
(
    [0] => Array
        (
            [num] => 1
            [pkts] => 0
            [bytes] => 0
            [target] => DROP
            [prot] => all
            [opt] => --
            [in] => *
            [out] => *
            [source] => 192.168.0.1/32
            [destination] => 192.168.0.2/32

        )

在B面,我也有一个数组。然而,这个有一点点不同。

   [1] => Array
        (
            [num] => 2
            [pkts] => 0
            [bytes] => 0
            [target] => DROP
            [prot] => all
            [opt] => --
            [in] => *
            [out] => *
            [source] => 192.168.5.5/32
            [destination] => 192.168.6.6/32
            [id] => 7
        )

如您所见,数组 B 还有另一列。列 ID。

我想做的是,从A的角度来比较这两者。

那么,

A-->B 那么我想输出差值。

在该字段中,我的数组 A 填充了 3 个规则,数组 B 填充了 4 个规则。

数组 A 需要查看数组 B,然后输出 不存在的内容。

可以这么说,数组 B 需要是数组 A 的精确副本。

我尝试过的是使用

array_diff
。然而,我发现这不起作用,因为数组 B 中有一个 ID 列,总是存在差异。

所以本质上我正在寻找的是一个修改后的 array_diff 查看数组 B 中的 ID 列...如何实现这一点?

php arrays associative-array array-difference
3个回答
2
投票

如前所述,您可以通过

unset
从内部数组中取消设置 id,或者通过
array_diff_uassoc
编写自己的比较函数:

http://www.php.net/manual/en/function.array-diff-uassoc.php


2
投票

那么问题出在哪里?

$arr1 = new ArrayObject(array('a' => 'bla', 'b' => 'blubb'));
$arr2 = new ArrayObject(array('a' => 'bla', 'b' => 'blubb', 'id' => 7));
$ignore = new ArrayObject(array('id'));

function compare(ArrayObject $arr1, ArrayObject $arr2, ArrayObject $ignore = null) {
    if ($ignore !== null && $ignore->count()) {
        foreach ($ignore as $offset2Ignore) {
            if ($arr2->offsetExists($offset2Ignore)) {
                $arr2->offsetUnset($offset2Ignore);
            }
        }
    }
    return $arr1 == $arr2;
}

上面显示的代码是什么= 首先它使用 SPL ArrayObject 而不是简单的数组。其次,我们定义偏移量,在第二个数组中必须忽略该偏移量。如果我们必须忽略偏移量,则可以迭代忽略项并取消设置偏移量。之后我们将其与数组进行比较。如果它们相等,则 funktion 返回 true ...否则 false。

如果你想知道数组之间的差异,可以使用 array_diff() 更改上面代码中的返回值。


1
投票

Michael Helwig 所做的另一种可能性是反其道而行之。

在 A 侧数组中添加

id
字段并使用
array_diff_uassoc
函数。如果需要,只需稍后取消添加的
id
字段即可。

© www.soinside.com 2019 - 2024. All rights reserved.