我有 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 列...如何实现这一点?
如前所述,您可以通过
unset
从内部数组中取消设置 id,或者通过 array_diff_uassoc
编写自己的比较函数:
那么问题出在哪里?
$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() 更改上面代码中的返回值。
Michael Helwig 所做的另一种可能性是反其道而行之。
在 A 侧数组中添加
id
字段并使用 array_diff_uassoc
函数。如果需要,只需稍后取消添加的 id
字段即可。