Сравните различия в многомерном массиве

0

У меня есть довольно уродливый запрос, и результаты запроса затем пост-обрабатываются с использованием php, который превращает каждую строку в собственный многомерный массив.

Я хочу реорганизовать запрос, но должен убедиться, что я не изменяю то, что он возвращает каким-либо образом.

Итак, что я хочу сделать, это скопировать исходный запрос и вызвать его, сохранить результаты. затем снова запустите функцию с моим новым запросом.

Прокрутите два массива результатов и сравните их для любых различий, которые так всегда (ключи, значения, отсутствующие записи, различия типов и т.д.).

Каков самый простой способ сделать это?

По сути, я знаю, как вызывать два запроса и т.д.,

Я думаю, мой реальный вопрос: в конце, когда у меня есть два моих массива результатов, как мне пройти и сравнить их.

То, что я хотел бы закончить, - это результат типа "print_r", расположенный рядом друг с другом с красной линией или похожим образом, выделяя любые различия.

Теги:
arrays
multidimensional-array
comparison

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; 
} 
1

Почему бы вам просто не сделать VIEW, который превратит уродливый запрос в то, что вы можете просто SELECT против? То, о чем вы говорите, - это материализованное представление, то, что MySQL не обрабатывает, а также другие платформы баз данных.

  • 0
    Это может ответить на вопрос, как выполнить рефакторинг в SQL, но это не касается того, как быть уверенным, что конечный результат одинаков.
  • 0
    Добавлена дополнительная информация внизу, чтобы прояснить вопрос
Показать ещё 1 комментарий
0

Почему бы не написать результаты каждого запроса в текстовые файлы, а затем сравнить два текстовых файла с командой diff?

  • 0
    По сути, это то, что я делаю в данный момент, но я просто надеялся, что есть способ «изменить» его в php;), поскольку это будет несколько быстрее (у меня есть около 50 запросов, которые мне нужно пройти)
  • 0
    Вы смотрели на массив PHP_Diff ()?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню