逐个键查找两行数据之间的差异

Finding the differences between two rows of data, key by key

我有两行数据 - 总是只有两行,但最多可以有大约四十列。列名因情况而异,但这里有一个代表性的例子:

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."!";
}

为什么这不起作用。

这个 "looked like" 它正在工作。由于许多列包含长字符串、颜色名称、日期等,因此当其中一列发生更改时,它会被适当地推送到差异数组中。问题是(当然)多个 "yes" 或 "no" 列的行为与我预期的不同。因此上面代码的结果,对于 table 例子是:

colour, width 

"seeing" 特色列或 on_sale 列没有更改,因为 data1 数组和 data2 数组都包含 no 和 yes。

我想我需要一个键一个键地比较?类似于 array_diff_key() 的反义词?但是我卡在这里了。

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

提前致谢。

我想你快到了。在您查询后可能是这样的:

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

至于 SQL,您可以使用 EXCEPT 来获取两个查询之间不同的行的列表,但您仍然需要遍历键并查找空值 - 这不会不会为你节省很多。