找到两行数据之间的差异,按键输入

时间:2018-01-16 11:27:53

标签: php mysql arrays comparison difference

我有两行数据 - 总是只有两行,但最多可能有四十列。列名称因具体情况而异,但这是一个代表性示例:

id | height | width | colour | in_stock | featured | on_sale
------------------------------------------------------------
1  |  30    |  20   |  black | yes      | no       |  yes
2  |  30    |  25   |  red   | yes      | yes      |  no

我希望将这两行之间的所有差异都放到一个数组中,这样我就可以记录从第1行到第2行的更改内容。

我认为array_diff()可以完成这项工作!

所以我高高兴兴地把array_diff()扔到了它:

//Simplified queries for the example

$sql1 = "SELECT * FROM table WHERE id = 1";
$rs1     = $conn->Execute($sql1);
$rs1     = $rs1->fields;

$sql2  = "SELECT * FROM table WHERE id = 2";
$rs2      = $conn->Execute($sql2);
$rs2      = $rs2->fields;

//Build first array
foreach($rs1 as $key => $value){
  $data1[$key] = $value;
}

//Build second array
foreach($rs2 as $key => $value){
  $data2[$key] = $value;
}

//Find the differences
$theDifferences = array_diff($data1, $data2);

//Loop through the differences logging the changes
foreach($theDifferences as $field => $value){
 echo "Change found for ".$field."!";
}

为什么这样做不起作用。

这"看起来像"它正在工作。由于许多列包含长字符串,颜色名称,日期等,因此当更改它时,它会被适当地推入差异数组中。问题是(当然)多重"是"或"不"列没有像我预期的那样表现。因此,对于表示例,上面代码的结果是:

colour, width 

不是"看到" feature或on_sale列已更改,因为data1数组和data2数组都不包含&s;是和

我想我需要按密钥进行比较?像array_diff_key()的反面?但在这里我被困住了。

我还考虑过是否可以单独使用SQL查询来完成,我认为这会更高效,但这远远超出了我的SQL能力。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我认为你几乎就在那里。在查询之后可能是这样的事情:

$theDifferences = array();
foreach($rs1 as $key => $value){
   if ($rs2[$key] != $value){
      $theDifferences[$key] = $value;
   }
}

对于SQL,您可以使用EXCEPT获取两个查询之间不同的行列表,但是您仍然必须循环键并查找空值 - 这不会保存你很多。