0

我有一个相当丑陋的查询,然后使用 php 对查询的结果进行后处理,将每一行变成它自己的多维数组。

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

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

循环遍历两个结果数组并比较它们是否存在任何差异(键、值、缺失条目、类型差异等)。

最简单的方法是什么?

基本上我知道如何调用这两个查询等,

我想我真正的问题是,最后,一旦我得到了两个结果数组,我该如何检查和比较它们。

我最想得到的是一个并排的“print_r”类型输出,带有一条红线或类似的横穿突出任何差异。

4

3 回答 3

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; 
} 
于 2012-08-29T02:20:03.900 回答
1

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

于 2012-08-29T01:44:34.483 回答
0

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

于 2012-08-29T02:17:22.607 回答