逐个键查找两行数据之间的差异
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 来获取两个查询之间不同的行的列表,但您仍然需要遍历键并查找空值 - 这不会不会为你节省很多。
我有两行数据 - 总是只有两行,但最多可以有大约四十列。列名因情况而异,但这里有一个代表性的例子:
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 来获取两个查询之间不同的行的列表,但您仍然需要遍历键并查找空值 - 这不会不会为你节省很多。