PHP-두 배열이 같은지 확인


280

두 배열이 같은지 확인하고 싶습니다. 같은 크기, 같은 인덱스, 같은 값을 의미합니다. 어떻게해야합니까?

사용하여 !==사용자에 의해 제안, 나는 다음과 같은 인쇄 것이라고 예상 입력 배열 (들)에 적어도 하나 개의 요소가 다른 경우지만, 사실은 그렇지 않습니다.

if (($_POST['atlOriginal'] !== $oldAtlPosition) 
    or ($_POST['atl'] !== $aext) 
    or ($_POST['sidesOriginal'] !== $oldSidePosition) 
    or ($_POST['sidesOriginal'] !== $sideext)) {

    echo "enter";
}

17
당신은 =너무 많이 사용하고 있다, !==또는!=
jeroen

29
기록을 위해 (내 편집이 "사용자"로 다시 변경
되었으므로)

7
['a'] == [0]입니다 true. 글쎄, 이것은 단지 PHP입니다.
Dávid Horváth

2
@ DávidHorváth 정말 이상합니다, 항상 좋은 습관을 사용하는 것이 좋습니다 ===
AFA Med

1
@ DávidHorváth, 느슨한 비교는 PHP뿐만 아니라 느슨합니다. JS를 보면 놀라게 될 것입니다. 더 잘 이해하기 전에는 사용하지 마십시오.
ryabenko-pro 2016

답변:


508
$arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs.
$arraysAreEqual = ($a === $b); // TRUE if $a and $b have the same key/value pairs in the same order and of the same types.

배열 연산자를 참조하십시오 .

편집하다

불평등 연산자는 !=비 정체성 운영자 인 반면 !==항등 연산자 일치 ==및 신원 연산자를 ===.


79
참고 사항 :이 방법 다차원 배열에서도 작동 합니다 (이전에는 나에게 분명하지 않았습니다).
trejder

5
추신 : 해결책은 사용하는 것입니다 array_values($a)==array_values($b)... 또 다른 일반적인 문제는 고유 값에 관한 것이므로 존재한다는 것을 기억하십시오 array_unique().
Peter Krauss

13
이 답변은 잘못되었습니다. ==와 같은 일반적인 사전에 대해서만 순서에 관계없이 작동합니다 [1 => 'a', 2 => 'b']. 예를 들어 [1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']. 인덱스 배열의 경우 ['a', 'b'] ==명시된대로 작동하지 않습니다. 예를 들어 ['a', 'b'] != ['b', 'a'].
nawfal

37
@nawfal : 당신의 가정이 잘못되었습니다. ['a', 'b']배열 [0 => 'a', 1 => 'b']이고, ['b', 'a']배열 [0 => 'b', 1 => 'a']입니다. 그래서 그들은 내 대답에 명시된 것과 동일한 키 / 값 쌍을 가지고 ==있지 않으며 그 사이에 작동하지 않는 이유 입니다.
Stefan Gehrig

29
@StefanGehrig 오 당신이 맞아요. 나는 나의 어리 석음 분명 :) 만들기 위해 같은 내 댓글을 남겨 둘 것이다
nawfal

88

이 페이지 에 따르면 .

참고 : 허용되는 답변은 연관 배열에 대해서는 작동하지만 인덱스 배열에 대해서는 예상대로 작동하지 않습니다 (아래 설명 참조). 둘 중 하나를 비교하려면이 솔루션을 사용하십시오. 또한이 함수는 다차원 배열에서 작동하지 않을 수 있습니다 (array_diff 함수의 특성으로 인해).

예를 들어 다음 과 같이 사용 $a == $b하거나 $a === $b실패 하는 요소가 다른 두 개의 인덱스 배열 테스트

<?php
    (array("x","y") == array("y","x")) === false;
?>

위의 의미이기 때문입니다.

array(0 => "x", 1 => "y")array(0 => "y", 1 => "x").

이 문제를 해결하려면 다음을 사용하십시오.

<?php
function array_equal($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff($a, $b) === array_diff($b, $a)
    );
}
?>

속도를 향상시킬 수있는 배열 크기 비교가 추가되었습니다 (super_ton에서 제안 함).


2

8
위의 의견은 거짓입니다. 만약 $ b에 $ a가 가지고있는 모든 요소에 여분의 요소를 더한 경우, 두 배열은 같지 않지만 위의 코드는 동일하다고 말할 것입니다.
Ghola

1
count ($ a) == count ($ b)도 추가 할 가치가 있습니다
stefan

1
@super_ton : 예, 전화하기 전에 array_diff비교 속도를 높일 수 있습니다. 추가하겠습니다. 감사합니다
lepe

3
불행히도, 어떤 경우에는 작동하지 않습니다. 예를 들어, 다음 경우로 테스트 $a = [1, 2, 2]; $b = [2, 1, 1];하고 반환 true했지만 두 배열은 분명히 동일하지 않습니다.
AwesomeGuy

33

직렬화를 시도하십시오. 중첩 된 하위 배열도 검사합니다.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";

7
비교를 사용하는 것처럼 키와 값이 바뀌면 문제가됩니다. 그러나 이들이 100 % 동일하다고 가정하면, 이것은 가장 평등하고 평등을 확인하는 가장 깨끗하고 쉬운 방법입니다!
Kevin Peno

1
이것이 최선의 해결책이라고 생각합니다! 다차원 배열과 연관 배열을 이전에 정렬 한 경우 비교할 수 있습니다!
라파엘 모니

13

키가 다른 순서로 제공되는 배열에서도 작동하는 간단한 솔루션 :

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}

3
아마도 지금까지 가장 좋은 대답 일 것입니다. 키가 이동되었거나 다차원 배열 인 경우 대부분의 대답이 일치하지 않습니다.
AwesomeGuy


9

!===구문 오류이기 때문에 작동하지 않습니다. 올바른 방법은 !==(세 개의 "같음"기호가 아님)


5
if (array_diff($a,$b) == array_diff($b,$a)) {
  // Equals
}

if (array_diff($a,$b) != array_diff($b,$a)) {
  // Not Equals
}

내 관점에서 array_intersect보다 array_diff를 사용하는 것이 좋습니다.이 특성을 확인하면 일반적으로 반환되는 차이가 유사성보다 작기 때문에 bool 변환은 메모리가 부족합니다.

편집 이 솔루션은 일반 배열 용이며 위에 만 게시 된 사전 == 및 ===을 보완합니다.


4

array_diff — 배열의 차이를 계산

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

array array_diff ( array $array1 , array $array2 [, array $... ] )

array1하나 이상의 다른 배열과 비교 하여 다른 배열 array1에없는 값을 반환합니다 .


4
OP는 "두 배열이 같은지 확인"하려고합니다. array_diff말할 수 없습니다. 시도하십시오 array_diff([1, 2], [1, 2, 'hello']).
marcv

3

값 순서에 관계없이 동등성을 확인하는 또 다른 방법은 http://php.net/manual/en/function.array-intersect.php 를 사용하여 작동합니다 .

$array1 = array(2,5,3);
$array2 = array(5,2,3);
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

다음은 http://php.net/manual/en/function.array-uintersect.php를 사용하는 다차원 배열에서도 작동하는 버전입니다 .

$array1 = array(
    array(5, 2),
    array(3, 6),
    array(2, 9, 4)
);
$array2 = array(
    array(3, 6),
    array(2, 9, 4),
    array(5, 2)
);

if($array1 === array_uintersect($array1, $array2, 'compare') && $array2 === array_uintersect($array2, $array1, 'compare')) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

function compare($v1, $v2) {
    if ($v1===$v2) {
        return 0;
    }
    if ($v1 > $v2) return 1;
    return -1;
}

3
function compareIsEqualArray(array $array1,array $array):bool
{

   return array_diff($array1,$array2)==[];

}

2
코드 예제가 수행하는 작업을 설명하면 도움이됩니다. 다차원 배열에서도 작동합니까?
k0pernikus

1
array_diff 반환 빈 배열이 배열이 동일한 경우는 array_diff 배열에서 다른 요소를 얻을
DILO sürücü

2

한 가지 방법 : ( http://tools.ietf.org/html/rfc6902#section-4.6에 대해 '동등한 것으로 간주'구현 )

이 방법을 사용하면 멤버가 다르게 정렬 된 연관 배열을 사용할 수 있습니다. 예를 들어 멤버는 모든 언어에서 동일하게 간주되지만 php :)

// recursive ksort
function rksort($a) {
  if (!is_array($a)) {
    return $a;
  }
  foreach (array_keys($a) as $key) {
    $a[$key] = ksort($a[$key]);
  }
  // SORT_STRING seems required, as otherwise
  // numeric indices (e.g. "0") aren't sorted.
  ksort($a, SORT_STRING);
  return $a;
}


// Per http://tools.ietf.org/html/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}

1
나는 당신이해야한다고 생각합니다 :$a[$key] = rksort($a[$key]);
pinkeen

2

배열의 구문 문제

$array1 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',
    'b' => 'value2',
    'c' => 'value3',
 );

$diff = array_diff($array1, $array2);

var_dump($diff); 

2

다음은 배열과 비교하여 다른 점을 얻는 방법에 대한 예입니다.

$array1 = ['1' => 'XXX', 'second' => [
            'a' => ['test' => '2'],
            'b' => 'test'
        ], 'b' => ['no test']];

        $array2 = [
            '1' => 'XX',
            'second' => [
                'a' => ['test' => '5', 'z' => 5],
                'b' => 'test'
            ],
            'test'
        ];


        function compareArrayValues($arrayOne, $arrayTwo, &$diff = [], $reversed = false)
        {
            foreach ($arrayOne as $key => $val) {
                if (!isset($arrayTwo[$key])) {
                    $diff[$key] = 'MISSING IN ' . ($reversed ? 'FIRST' : 'SECOND');
                } else if (is_array($val) && (json_encode($arrayOne[$key]) !== json_encode($arrayTwo[$key]))) {
                    compareArrayValues($arrayOne[$key], $arrayTwo[$key], $diff[$key], $reversed);
                } else if ($arrayOne[$key] !== $arrayTwo[$key]) {
                    $diff[$key] = 'DIFFERENT';
                }
            }
        }

        $diff = [];
        $diffSecond = [];

        compareArrayValues($array1, $array2, $diff);
        compareArrayValues($array2, $array1, $diffSecond, true);

        print_r($diff);
        print_r($diffSecond);

        print_r(array_merge($diff, $diffSecond));

결과:

Array
(
    [0] => DIFFERENT
    [second] => Array
        (
            [a] => Array
                (
                    [test] => DIFFERENT
                    [z] => MISSING IN FIRST
                )

        )

    [b] => MISSING IN SECOND
    [1] => DIFFERENT
    [2] => MISSING IN FIRST
)

1

PHP 함수 사용 array_diff (array1, array2);

배열 간의 차이를 반환합니다. 비어 있으면 동일합니다.

예:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3'
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value4'
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print array = (0 => ['c'] => 'value4' ) 

예 2 :

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print empty; 

1
기술적으로 배열 간의 차이를 반환하지 않습니다. 설명서에는 "array1을 하나 이상의 다른 배열과 비교하고 다른 배열에없는 array1의 값을 반환합니다."라고 나와 있습니다. 그래서,하는 array1의 모든 경우 값은 배열 2보다 값이있는 경우에도, array_diff는 하늘의 배열 반환, 배열 2에 존재하는
2pha

"널 인쇄"하지 않고 빈 배열을 인쇄합니다 (약 12 개의 구문 오류를 수정 한 후). 어쩌면 (count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0배열이 "동일한"지 테스트 하는 데 사용할 수 있습니다
user9645

구문을 수정했습니다 (null이 비어 있지 않고 쉼표 -.- 혼합). 당신이 제안하는 것은 너무 많다고 생각합니다. 빈 배열이 충분한 지 확인하십시오.
Wolfgang Leon

1

비 연관 배열을 확인하려는 경우 해결책은 다음과 같습니다.

$a = ['blog', 'company'];
$b = ['company', 'blog'];

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.