2013-12-18 8 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. > B 나는 출력에 차이를 원하는 -

무엇 내가하고 싶은, 그래서,

A가

A.

의 눈에서이 두 가지를 비교합니다.

필드에는 3 개의 규칙으로 채워진 배열 A와 4 개의 규칙으로 된 배열 B가 있습니다.

어레이 A는 어레이 B를 살펴보고 이없는 것을 출력해야합니다.

어레이 B는 말하자면 어레이 A의 정확한 사본이어야합니다.

내가 시도한 것은 array_diff입니다. 그러나 배열 B에 ID 열이 있기 때문에 이것이 작동하지 않는다는 것을 알았습니다. 항상 차이점이 있습니다.

본질적으로 내가 찾고있는 것은 이 아닌 배열 B의 ID 열을 보면 수정 된 array_diff입니다. 어떻게 이것을 수행할까요?

+2

ID 열을 해제하고 (prolly 복사본을 만든 다음) ID가없는 배열에서 array diff를 사용할 수 없습니까? – Nanne

+0

두 배열 모두'id' 열을 가지고 있습니다. – Minoru

+0

@LucasHarada 죄송합니다. 붙여 넣기에 약간 미쳐갔습니다. 내 상황을 편집 해보세요. – MichaelP

답변

2

이미 언급 한 바와 같이, 그럴 수 중 array_diff_uassoc를 통해 unset 또는 자신의 비교 함수를 작성을 통해 내부 배열의 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

Thanks Michael, 'unset()'은 이제 추가 치수를 추가하여 작동합니다. – MichaelP

1

마이클 Helwig 무슨 짓을했는지에 대한 또 다른 가능성은 반대를하는 것입니다 .

측면 A 배열에 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를 사용합니다. 두 번째 배열에서 무시해야하는 오프셋을 정의합니다. 오프셋을 무시해야한다면 항목 무시를 통해 반복하고 오프셋을 설정 해제하십시오. 그 후 배열을 비교합니다. 동등한 경우 funktion은 true를 반환하고 그렇지 않으면 false를 반환합니다.

배열의 차이점을 알고 싶다면 array_diff()를 사용하여 위의 코드에서 반환 값을 변경할 수 있습니다.