我正在进行一些单元测试。我的结果是大型多维数组。我不想比较整个数组,而只是在这个“层次结构”中只有几个键。这是我预期的数组的片段:
$expected = array(
'john' => array(
'maham' => 4563,
),
'gordon' => array(
'agrar' => array(
'sum' => 7895,
),
),
'invented' => 323,
);
结果数组较大,但有一些条目与我预期的条目相同。所以我想比较一下。如果值相等。
我尝试了一些array_intersect,diff函数,但似乎它们不适用于多维数组。
是否有一种方法可以在我期望的数组上使用array_walk_recursive并获取结果数组的相应键?像指针或参考的东西?
答案 0 :(得分:3)
array_intersect()
不会比较关联键,它只会查看值,您需要使用array_intersect_assoc()
来比较键和值。但是,此函数仅比较基本密钥而不是嵌套数组的键。
array_intersect_assoc($expected, $result);
也许最好的解决方案是使用array_uintersect_assoc()
使用以下技术,您可以在其中定义比较函数。
$intersect = array_uintersect_assoc($expected, $result, "comp"));
function comp($value1, $value2) {
if (serialize($value1) == serialize($value2)) return 0;
else return -1;
}
echo '<pre>';
print_r($intersect);
echo '</pre>';
除了您的评论之外,以下代码还应返回$result
中$expected
中具有预期结构的所有元素。
// get intersecting sections
$intersect = array_uintersect_assoc($expected, $results, "isStructureTheSame");
//print intersecting set
echo "<pre>";
print_r($intersect);
echo "</pre>";
//print results that are in intersecting set (e.g. structure of $expected, value of $results
echo "<pre>";
print_r(array_uintersect_assoc($results, $intersect, "isStructureTheSame"));
echo "</pre>";
function isStructureTheSame($x, $y) {
if (!is_array($x) && !is_array($y)) {
return 0;
}
if (is_array($x) && is_array($y)) {
if (count($x) == count($y)) {
foreach ($x as $key => $value) {
if(array_key_exists($key,$y)) {
$x = isStructureTheSame($value, $y[$key]);
if ($x != 0) return -1;
} else {
return -1;
}
}
}
} else {
return -1;
}
return 0;
}
答案 1 :(得分:2)
我知道应该有办法解决这个问题!它的array_replace_recursive!
$expected = array_replace_recursive($result, array(
/* expected results (no the whole array) */
));
// $expected is now exactly like $result, but $values differ.
// Now can compare them!
$this->assertEquals($expected, $result);
这是解决方案!