Утверждая два массива с числовыми строками в виде ключей

StackOverflow https://stackoverflow.com/questions/19834741

Вопрос

У меня есть два массива, которые должны быть равны.

Когда 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

Краткое описание сравнения фпунита:

$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. Но способ Shooter в использовании функций сериализации.

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

Но это не выглядит намного лучше. :^)

Также вы можете использовать assertSame.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top