문제

나는 동일 해야하는 두 개의 배열이 있습니다.

var 덤핑 및 동등한 지 여부를 주장 할 때 다음 출력을 얻습니다.

array(2) {
  [0]=>
  array(3) {
    ["100"]=>         //notice that the key is NOT numeric
    int(0)
    ["strKey1"]=>
    int(0)
    ["strKey2"]=>
    int(0)
  }
  [1]=>
  array(3) {
    ["100"]=>         //notice that the key is NOT numeric
    int(0)
    ["strKey1"]=>
    int(0)
    ["strKey2"]=>
    int(0)
  }
}
There was 1 failure:

1) Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (
-    '100' => 0
     'strKey1' => 0
     'strKey2' => 0
+    '100' => 0
 )

키를 다시 숫자로 매핑하는 두 배열 모두에 대한 간단한 foreach 루프는 잘 작동하지만 테스트에서 가장 예쁜 해킹은 아닙니다.

    $actualArray = array();

    foreach ($actualOriginal as $key => $value) {
        $actualArray[$key] = $value;    
    }

    $expectedArray = array();

    foreach ($expectedOriginal as $key => $value) {
        $expectedArray[$key] = $value;    
    }

이 배열이 동등한 것으로 간주되지 않는 이유는 무엇입니까?

도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

숫자 문자열 키를 얻는 방법 중 하나만 알고 있습니다 : 객체를 배열로 변환하여

$object = new stdClass();
$object->{'100'} = 0;
$object->strKey1 = 0;
$object->strKey2 = 0;
$array1 = (array) $object;
var_dump($array1);
//array(3) {
//  '100' => -- string
//  int(0)
//  'strKey1' =>
//  int(0)
//  'strKey2' =>
//  int(0)
//}

따라서 $ array1 은이 $ array2와 같지 않습니다.

$array2 = array('100' => 0, 'strKey1' => 0, 'strKey2' => 0,);
var_dump($array2);
//array(3) {
//  [100] => -- integer
//  int(0)
//  'strKey1' =>
//  int(0)
//  'strKey2' =>
//  int(0)
//}
var_dump($array1 == $array2);
//bool(false)

버그가 아닙니다 : https://bugs.php.net/bug.php?id=61655


또한 PHPUnit에는 고유 한 비교 규칙이 있습니다.

$this->assertEquals($array1, $array1); // Fail
$this->assertEquals($array1, $array1); // Pass

https://github.com/sebastianbergmann/phpunit/blob/3.7/phpunit/framework/comparator/array.php

phpunit 비교에 대한 간단한 설명 :

$expected = $array1;
$actual = $array1;

$remaining = $actual;
$equal = TRUE;
foreach ($expected as $key => $value){
    unset($remaining[$key]);} // string numeric keys would not be unsetted.

if ($remaining)
    $equal = FALSE;

var_dump($equal);
//bool(false)

그래서 ... 당신은 그것을 제대로하고 있습니다. "일반"배열을 얻으려면 배열을 재현해야합니다. Foreach를 사용할 수 있습니다. 그러나 Shoter Way는 직렬화 기능을 사용하고 있습니다.

$this->assertEquals(unserialize(serialize($array1)), unserialize(serialize($array1)));
//Pass

그러나 훨씬 나아 보이지는 않습니다. :^)

또한 사용할 수 있습니다 assertSame.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top