2013-12-18 3 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 
     ) 

Как вы можете видеть, Array B имеет другую колонку. Идентификатор столбца.

То, что я хочу сделать, это, сравнить эти два с глаз А.

Так,

A -> B, то я хочу, чтобы вывести разницу.

В поле есть массив A, заполненный 3 правилами, и Array B, например, 4 правила.

Array A необходимо посмотреть на массив B, затем выводить то, что не там.

Array B должен быть точной копией Array A, если можно так выразиться.

То, что я пробовал, заключается в использовании array_diff. Тем не менее, я обнаружил, что это не работает, поскольку в массиве B есть столбец идентификатора, всегда являющийся разницей.

Так что в основном я ищу измененный массив_дифф, который не Посмотрите на столбец ID в массиве B ... как этого достичь?

+2

Не могли бы вы просто отменить столбец идентификатора (сделать копию умно), а затем использовать array diff для массива без id? – Nanne

+0

Оба массива имеют столбец 'id'. – Minoru

+0

@LucasHarada Ой, извините, немного с ума сошел. Посмотрите сейчас, отредактировав мою ситуацию. – MichaelP

ответ

2

Как уже упоминалось, вы можете либо снята с охраны идентификатор из внутреннего массива через unset или написать свою собственную функцию сравнения с помощью array_diff_uassoc:

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

+0

Я попробовал unset (userINPUT [10]), но поле id все еще там .. Я делаю это правильно? – MichaelP

+0

Я не знаю, как выглядит ваша структура массива, поэтому я не могу сказать вам, как ссылаться на ваши элементы. Это должно быть что-то вроде 'unset ($ myArray [1] [" ID "]), если ваш внутренний массив с ключом ID находится в позиции 1 вашего внешнего массива. –

+0

Спасибо Michael, 'unset()' работает теперь, добавляя дополнительное измерение. – MichaelP

1

Другая возможность для того, что сделал Майкл Helwig это сделать наоборот ,

Добавить поле id в сторону. Массив и использовать функцию 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().

Смежные вопросы