У меня есть довольно уродливый запрос, и результаты запроса затем пост-обрабатываются с использованием php, который превращает каждую строку в собственный многомерный массив.
Я хочу реорганизовать запрос, но должен убедиться, что я не изменяю то, что он возвращает каким-либо образом.
Итак, что я хочу сделать, это скопировать исходный запрос и вызвать его, сохранить результаты. затем снова запустите функцию с моим новым запросом.
Прокрутите два массива результатов и сравните их для любых различий, которые так всегда (ключи, значения, отсутствующие записи, различия типов и т.д.).
Каков самый простой способ сделать это?
По сути, я знаю, как вызывать два запроса и т.д.,
Я думаю, мой реальный вопрос: в конце, когда у меня есть два моих массива результатов, как мне пройти и сравнить их.
То, что я хотел бы закончить, - это результат типа "print_r", расположенный рядом друг с другом с красной линией или похожим образом, выделяя любые различия.
Прежде всего, вы можете использовать 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;
}
Почему бы вам просто не сделать VIEW
, который превратит уродливый запрос в то, что вы можете просто SELECT
против? То, о чем вы говорите, - это материализованное представление, то, что MySQL не обрабатывает, а также другие платформы баз данных.
Почему бы не написать результаты каждого запроса в текстовые файлы, а затем сравнить два текстовых файла с командой diff
?