2012-08-29 99 views
0

我有一个相当丑陋的查询,然后使用php将查询结果进行后处理,将每行都转换为它自己的多维数组。在多维数组中比较差异

我想重构查询,但需要确保我不会以任何方式更改它返回的内容。

所以我想要做的是复制原始查询并调用它,存储结果。 然后用我的新查询再次运行该函数。

将两个数组结果进行循环并比较它们之间的差异(键,值,缺失条目,类型差异等)。

这样做最简单的方法是什么?

基本上我知道怎么称呼这两个查询等,

我想我真正的问题是,在最后一次,我有我的结果我怎么去通过并加以比较的两个数组。

我最想结束的是一个并排“print_r”类型的输出,带有红线或类似的突出显示任何差异的输出。

回答

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

为什么你不只是做一个VIEW,把一个丑陋的查询变成你可以只对SELECT针对?你在谈论的是制作一个物化视图,这是MySQL无法像其他数据库平台一样处理的东西。

+0

这* *可能*回答如何在SQL中进行重构,但它没有解决如何确定最终结果是否相同。 –

+0

在底部添加了更多信息以使问题更清晰 – Hailwood

+0

噢,如果您想比较两个查询的结果,您可以使用'TEMPORARY TABLE',在这里您可以查询'WHERE result_a!= result_b',给定A和B为填充你的结果。你可以用'INSERT INTO temp_table(SELECT ...)'然后'INSERT IGNORE INTO temp_table(SELECT ...)ON DUPLICATE KEY SET ...'来建立这些,但是它会变得很混乱。与此相比,在应用程序层中组合两个不同的查询并不是一个可怕的想法。 – tadman

0

为什么不将每个查询的结果写入文本文件,然后将这两个文本文件与diff命令进行比较?

+0

这基本上是我目前正在做的,但我只是希望有一种方法来“差异化”在PHP中),因为这会更快一些(我有大约50个查询我需要去) – Hailwood

+0

有你看着php的array_diff()? – AllInOne

+0

是的,它可以给我一个差异数组,但我希望能够通过整个结果集的并排视图执行print_r类型的输出。 – Hailwood