2013-12-18 100 views
0

我有2個數組,我想比較。在A方,它包含IPtables規則拆分成單獨的列。 示例輸出數組A;比較2個數組的內容

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列...如何實現這一目標?

+2

難道你不能只是取消設置ID列(做一個副本prolly),然後使用數組比較沒有ID的數組? – Nanne

+0

這兩個數組都有列'id'。 – Minoru

+0

@LucasHarada哎呀抱歉,粘貼時有點瘋狂。現在看看,編輯我的情況。 – MichaelP

回答

2

如前所述,您既可以取消設置從內陣列通過unset或寫自己的比較函數通過array_diff_uassoc的ID:

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

+0

我試過unset(userINPUT [10]),但id字段仍然存在..我是否正確地做了這件事? – MichaelP

+0

我不知道你的數組結構是怎麼樣的,所以我不能告訴你如何引用你的元素。如果你的帶有ID鍵的內部數組在你的外部數組的位置1,它應該是'unset($ myArray [1] [「ID」])''。 –

+0

感謝Michael,'unset()'現在通過增加一個額外的維度。 – MichaelP

1

另一種可能性爲邁克爾·Helwig確實是反其道而行之。

在側面添加一個id字段A數組使用array_diff_uassoc函數。如果您需要,請稍後取消添加的id字段。

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而不是簡單的數組。其次,我們定義偏移量,這在第二個數組中必須被忽略。如果我們不得不忽略偏移量,那麼迭代忽略項目並取消偏移量。之後,你將比較陣列。如果它們相等,則函數返回true,否則返回false。

如果您想知道數組之間的區別,可以使用array_diff()更改上面代碼中的返回值。