我有两行数据 - 总是只有两行,但最多可能有四十列。列名称因具体情况而异,但这是一个代表性示例:
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能力。
提前致谢。
答案 0 :(得分:1)
我认为你几乎就在那里。在查询之后可能是这样的事情:
$theDifferences = array();
foreach($rs1 as $key => $value){
if ($rs2[$key] != $value){
$theDifferences[$key] = $value;
}
}
对于SQL,您可以使用EXCEPT获取两个查询之间不同的行列表,但是您仍然必须循环键并查找空值 - 这不会保存你很多。