我有一个相当丑陋的查询,然后使用php对查询结果进行后处理,将每行转换为自己的多维数组。
我想重构查询,但需要确保我不会以任何方式更改它返回的内容。
所以我想做的是复制原始查询并调用它,存储结果。 然后使用我的新查询再次运行该函数。
循环遍历两个结果数组,并比较它们之间的任何差异(键,值,缺失条目,类型差异等)。
最简单的方法是什么?
基本上我知道如何调用两个查询等,
我想我真正的问题是,最后,如果我有两个结果数组,我该如何进行比较呢。
我最喜欢的是一个并排的“print_r”类型输出,红线或类似的突出显示任何差异。
答案 0 :(得分:4)
首先,您可以像这样使用array_uintersect_assoc()。
// First get intersecting values
$intersect = array_uintersect_assoc($expected, $results, "checkStructure");
print_r($intersect);
//Then print results that are in intersecting set (e.g. structure of $expected, value of $results
print_r(array_uintersect_assoc($results, $intersect, "checkStructure"));
function checkStructure($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 = checkStructure($value, $y[$key]);
if ($x != 0) return -1;
} else {
return -1;
}
}
}
} else {
return -1;
}
return 0;
}
如果仍然没有,请抓住array_diff()的帮助 和array_diff_assoc()。或者尝试使用以下代码。
function multidimensional_array_diff($a1,$a2)
{
$r = array();
foreach ($a2 as $key => $second)
{
foreach ($a1 as $key => $first)
{
if (isset($a2[$key]))
{
foreach ($first as $first_value)
{
foreach ($second as $second_value)
{
if ($first_value == $second_value)
{
$true = true;
break;
}
}
if (!isset($true))
{
$r[$key][] = $first_value;
}
unset($true);
}
}
else
{
$r[$key] = $first;
}
}
}
return $r;
}
答案 1 :(得分:1)
为什么不让VIEW
将丑陋的查询变成SELECT
反对的内容?你所谈论的是制作物化视图,这是MySQL无法处理的东西以及其他数据库平台。
答案 2 :(得分:0)
为什么不将每个查询的结果写入文本文件,然后将这两个文本文件与diff
命令进行比较?