0

私はかなり醜いクエリを持っています、そしてクエリからの結果はそれから各行をそれ自身の多次元配列に変えるphpを使って後処理されます。

クエリをリファクタリングしたいのですが、返される内容を変更しないようにする必要があります。

だから私がしたいのは、元のクエリをコピーしてそれを呼び出し、結果を保存することです。次に、新しいクエリを使用して関数を再度実行します。

結果の2つの配列をループし、それらを比較して、これまでの違い(キー、値、エントリの欠落、タイプの違いなど)を確認します。

これを行う最も簡単な方法は何ですか?

基本的に、2つのクエリなどを呼び出す方法を知っています。

私の本当の質問は、最後に、結果の2つの配列を取得したら、それらをどのように調べて比較するかということだと思います。

最終的には、「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

各クエリの結果をテキストファイルに書き込んでから、2つのテキストファイルをdiffコマンドで比較してみませんか?

于 2012-08-29T02:17:22.607 に答える