أعرف طريقة واحدة فقط كيفية الحصول على مفاتيح سلسلة رقمية: عن طريق تحويل كائن إلى صفيف
$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
.