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

Php 逐键查找两行数据之间的差异,php,mysql,arrays,comparison,difference,Php,Mysql,Arrays,Comparison,Difference,我有两行数据——总是只有两行,但最多可能有40列左右。列名因具体情况而异,但下面是一个代表性示例: id | height | width | colour | in_stock | featured | on_sale ------------------------------------------------------------ 1 | 30 | 20 | black | yes | no | yes 2 | 30 | 25

我有两行数据——总是只有两行,但最多可能有40列左右。列名因具体情况而异,但下面是一个代表性示例:

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扔了出去,这样:

//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."!";
}
为什么那不起作用

这看起来很有效。由于许多列包含长字符串、颜色名称、日期等,因此当一个列发生更改时,它会被适当地推入差异数组。当然,问题是多个yes或no列的行为并不像我预期的那样。因此,对于表格示例,上述代码的结果为:

colour, width 
因为data1数组和data2数组都包含“否”和“是”,所以它没有看到功能列或on_sale列发生更改

我想我需要逐个键进行比较?类似于数组_diff _key的反面?但我被困在这里了

我还考虑了是否可以单独使用SQL查询来实现这一点,我认为这会更有效,但这远远超出了我的SQL能力


提前谢谢

我想你就快到了。在您询问之后,可能会出现类似的情况:

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

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

我知道这只是一个示例,但可能需要修补$rs1=$rs2->字段;至$rs1=$rs1->字段;在第5行,以避免混淆。您是否尝试了数组_diff _assoc函数?它会像doc中提到的那样进行额外的索引检查,当然常数是列数?@Nate Reynolds-可以thanks@SajeshBahing-我会查的,谢谢你的链接破解了它。非常感谢您的SQL建议: