Ich weiß nur eine Möglichkeit, wie man numerische String -Tasten bekommt: Durch Konvertieren von Objekt in Array
$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 ist also nicht gleich diesem $ 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)
Es ist kein Fehler: https://bugs.php.net/bug.php?id=61655
Auch Phpunit hat seine eigenen Vergleichsregeln.
$this->assertEquals($array1, $array1); // Fail
$this->assertEquals($array1, $array1); // Pass
https://github.com/sebastianbergmann/phpunit/blob/3.7/phpunit/framework/comparator/array.php
Kurzbeschreibung des Phpunit -Vergleichs:
$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)
Also ... du machst es richtig. Um "normales" Array zu erhalten, müssen Sie das Array neu erstellen. Sie könnten für den Ereignis verwenden. Aber Shotter Way besteht darin, Serialisierungsfunktionen zu verwenden.
$this->assertEquals(unserialize(serialize($array1)), unserialize(serialize($array1)));
//Pass
Aber es sieht nicht viel besser aus. :^)
Sie könnten auch verwenden assertSame
.