我想要比较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
)
如您所见,Array B有另一列。列ID。
我想要做的是,从A的眼睛比较这两个。
所以,
A - > B然后我想输出差异。
在该字段中,我有阵列A填充3个规则,阵列B填充示例4规则。
数组A需要查看数组B,然后输出不存在的内容。
阵列B需要是阵列A的精确副本,可以这么说。
我尝试过的是使用array_diff
。但是,我发现这不起作用,因为数组B中有一个ID列,总是不同。
基本上我正在寻找的是一个修改过的array_diff 不查看数组B中的ID列...如何实现这一目标?
答案 0 :(得分:2)
如前所述,您可以通过unset
取消内部数组的ID,也可以通过array_diff_uassoc
编写自己的比较函数:
答案 1 :(得分: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()更改上面代码中的返回值。
答案 2 :(得分:1)
Michael Helwig所做的另一种可能性是反其道而行。
在A侧数组中添加id
字段并使用array_diff_uassoc
函数。如果需要,请稍后取消设置添加的id
字段。