比较2个数组的内容

时间:2013-12-18 12:40:25

标签: php arrays

我想要比较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列...如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

如前所述,您可以通过unset取消内部数组的ID,也可以通过array_diff_uassoc编写自己的比较函数:

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

答案 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字段。