我有两个应该相等的数组。
当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;
}
为什么这些数组被认为不相同的任何建议?
感谢您的帮助!
答案 0 :(得分:0)
我只知道如何获取数字字符串键:通过将对象转换为数组
$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。但是镜头方式是使用序列化功能。
$this->assertEquals(unserialize(serialize($array1)), unserialize(serialize($array1)));
//Pass
但它看起来并没有那么好。 :^)
您也可以使用assertSame
。