Php 逐键查找两行数据之间的差异
我有两行数据——总是只有两行,但最多可能有40列左右。列名因具体情况而异,但下面是一个代表性示例: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
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建议: