我有两行数据-总是只有两行,但最多可能有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."!";
}
为什么那不管用。
这个“看起来”很有效。由于许多列包含长字符串、颜色名称、日期等,因此当其中一个列发生更改时,它会被适时地推送到differences数组中。问题是(当然)多个“yes”或“no”列的行为与我预期的不同。因此,对于表格示例,上面代码的结果是:
colour, width
因为data1数组和data2数组都包含no和yes,所以不能“看到”featured或on-sale列发生了更改。
我想我需要逐项比较?类似于array_diff_key()的反义词?但我被困在这里了。
我还考虑了是否可以只使用sql查询来实现这一点,我认为这样效率更高,但这远远超出了我的sql能力。
提前谢谢。
1条答案
按热度按时间oxosxuxt1#
我想你就快到了。在你询问之后,也许会这样:
至于sql,您可以使用except来获取两个查询之间不同的行列表,但是您仍然需要循环遍历键并查找空值—这并不能节省很多时间。