programing

PHP - 두 배열이 동일한지 확인합니다.

goodjava 2022. 10. 23. 21:25

PHP - 두 배열이 동일한지 확인합니다.

두 배열이 동일한지 확인하고 싶습니다.같은 크기, 같은 지수, 같은 값.내가 어떻게 그럴 수 있을까?

사용.!==사용자가 제안했듯이 어레이 내의 적어도1개의 요소가 다른 경우 다음과 같이 enter를 출력할 것으로 예상되지만 실제로는 그렇지 않습니다.

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

    echo "enter";
}
$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.

어레이 연산자를 참조하십시오.

편집

부등식 연산자는!=비표준 연산자는!==등식 연산자를 일치시키다==그리고 아이덴티===.

페이지에 따르면.

메모: 사용 가능한 답변은 관련지어 어레이에서는 동작하지만 인덱스 어레이에서는 정상적으로 동작하지 않습니다(아래 설명).둘 중 하나를 비교하려면 이 솔루션을 사용하십시오.또한 이 함수는 (array_diff 함수의 특성상) 다차원 배열에서는 작동하지 않을 수 있습니다.

2개의 인덱스 어레이 테스트(요소의 순서가 다른 경우)$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에서 제안).

시리얼라이즈를 시도합니다.그러면 중첩된 하위 배열도 검사됩니다.

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

다른 순서로 키가 주어지는 어레이에서도 동작하는 쇼트 솔루션:

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

다른 값과 비교합니다.

if($array_a == $array_b) {
  //they are the same
}

모든 어레이 연산자에 대해서는, http://php.net/manual/en/language.operators.array.php 를 참조해 주세요.예를 들어 다음과 같습니다.===는 어레이 내 요소의 유형과 순서가 동일한지도 확인합니다.

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

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

}

!===구문 오류이므로 작동하지 않습니다.올바른 방법은!==(3개의 "표시 대상" 기호가 아님)

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

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

제 관점에서는 array_diff를 array_intersect보다 사용하는 것이 좋습니다.이러한 성질을 체크하면 공통적으로 반환되는 차이가 유사점보다 적어지기 때문입니다.이렇게 하면 부울 변환에 필요한 메모리가 줄어듭니다.

편집 이 솔루션은 일반 어레이용이며 사전에만 유효한 위에 게시된 == 및 ===를 보완합니다.

값 순서에 관계없이 동등성을 확인하는 또 다른 방법은 다음과 같이 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;
}

한 가지 방법: (https://www.rfc-editor.org/rfc/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 https://www.rfc-editor.org/rfc/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}

array_diff : 배열의 차이를 계산합니다.

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

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

<고객명>의 비교array1하나 이상의 다른 어레이와 비교하여 값을 반환합니다.array1하다

어레이 구문 문제

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

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

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

var_dump($diff); 

다음은 어레이와 비교하여 어레이 간의 차이를 확인하는 예입니다.

$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
)

연관성이 없는 어레이를 체크하는 경우는, 다음과 같은 해결책이 있습니다.

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

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals

다음 솔루션은 콜백으로 전달할 수 있는 커스텀 평등 함수와 함께 작동합니다.어레이의 순서는 체크되지 않습니다.

trait AssertTrait
{
    /**
     * Determine if two arrays have the same elements, possibly in different orders. Elements comparison function must be passed as argument.
     *
     * @param array<mixed> $expected
     * @param array<mixed> $actual
     *
     * @throws InvalidArgumentException
     */
    public static function assertArraysContainSameElements(array $expected, array $actual, callable $comparisonFunction): void
    {
        Assert::assertEquals(\count($expected), \count($actual));

        self::assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes($expected, $actual, $comparisonFunction);
        self::assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes($actual, $expected, $comparisonFunction);
    }

    /**
     * @param array<mixed> $needles
     * @param array<mixed> $haystack
     *
     * @throws InvalidArgumentException
     */
    private static function assertEveryElementOfArrayIsInAnotherArrayTheSameAmountOfTimes(
        array $needles,
        array $haystack,
        callable $comparisonFunction
    ): void {
        Assert::assertLessThanOrEqual(\count($needles), \count($haystack));

        foreach ($needles as $expectedElement) {
            $matchesOfExpectedElementInExpected = \array_filter(
                $needles,
                static fn($element): bool => $comparisonFunction($expectedElement, $element),
            );

            $matchesOfExpectedElementInActual = \array_filter(
                $haystack,
                static fn($element): bool => $comparisonFunction($expectedElement, $element),
            );

            Assert::assertEquals(\count($matchesOfExpectedElementInExpected), \count($matchesOfExpectedElementInActual));
        }
    }
}

일반적으로 데이터베이스 통합 테스트에서 예상된 요소가 반환되는지 확인하고 싶지만 정렬에는 관심이 없습니다.

두 배열이 동일한지 여부를 비교하는 적절한 방법은 재귀적으로 비교하는 완전 등식(===)을 사용하는 것입니다.기존 응답은 임의 배열(순차 배열과 연관 배열이 혼합된 임의 깊이와 순서를 가진 배열)을 재귀적으로 정렬할 수 없으므로 임의 배열의 비교를 처리할 수 없습니다.시퀀셜 어레이는 시퀀셜 키(0,1,2,3...)를 가진 어소시에이션 어레이입니다만, 어소시에이션 어레이에는 시퀀셜 키가 없습니다.

이러한 임의의 어레이를 정렬하려면 , 다음의 작업을 실시할 필요가 있습니다.

  1. 하위 배열이 필요 없는 리프 노드를 향해 아래로 이동
  2. 시퀀셜 어레이를 시리얼화하여 정렬(커스텀 컴퍼레이터를 사용할 필요가 없음)
  3. 키별로 연관 배열 정렬

다음 코드는 위에서 설명한 솔루션을 구현합니다.법규의 개선을 환영한다.

function recur_sort( &$array ) {
    foreach ( $array as &$value ) {
       if ( is_array( $value ) ) recur_sort( $value );
    }

    if ( is_sequential_array( $array ) ) {
        $array = array_map( function( $el ) { return json_encode( $el ); }, $array  );
        sort( $array, SORT_STRING );
        $array = array_map( function( $el ) { return json_decode( $el, true ); }, $array  );
        return;
    } else {
        return ksort( $array );
    }
}

function is_sequential_array(Array &$a) {
    $n = count($a);
    for($i=0; $i<$n; $i++) {
        if(!array_key_exists($i, $a)) {
            return false;
        }
    }
    return true;
}

예(PHPUnit):

//A stricter and recursive assertEqualsCanonicalizing
public function assertSameCanonicalizing( $expected, $actual ) {
    recur_sort( $expected );
    recur_sort( $actual );
    $this->assertSame( $expected, $actual );
}

동일한지 ( 「」 「」 「」 「」 「」=== 과 같은 할 수 있습니다

function array_eq($a, $b) {
    // If the objects are not arrays or differ in their size, they cannot be equal
    if (!is_array($a) || !is_array($b) || count($a) !== count($b)) {
        return false;
    }
    // If the arrays of keys are not strictly equal (after sorting),
    // the original arrays are not strictly equal either
    $a_keys = array_keys($a);
    $b_keys = array_keys($b);
    array_multisort($a_keys);
    array_multisort($b_keys);
    if ($a_keys !== $b_keys) {
        return false;
    }
    // Comparing values
    foreach ($a_keys as $key) {
        $a_value = $a[$key];
        $b_value = $b[$key];
        // Either the objects are strictly equal or they are arrays
        // which are equal according to our definition. Otherwise they
        // are different.
        if ($a_value !== $b_value && !array_eq($a_value, $b_value)) {
            return false;
        }
    }
    return true;
}

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; 

언급URL : https://stackoverflow.com/questions/5678959/php-check-if-two-arrays-are-equal