作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两行数据 - 始终只有两行,但最多可能有四十列左右。列名称因具体情况而异,但以下是一个代表性示例:
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."!";
}
为什么这不起作用。
这“看起来”正在发挥作用。由于许多列包含长字符串、颜色名称、日期等,因此当其中一个发生更改时,它会被适本地插入差异数组中。问题是(当然)多个"is"或“否”列的行为并不符合我的预期。因此,对于表示例,上述代码的结果是:
colour, width
它不会“看到”featured 或 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 来获取两个查询之间不同的行列表,但您仍然必须循环遍历键并查找空值 - 这并不能为您节省很多.
关于php - 逐个键查找两行数据之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280199/
我尝试在 d3.js 中进行链式转换。为此,我在数组中定义了一组转换,并(尝试)创建一个函数以使用 .each("end", function()) 递归调用它们,以在前一个为完成,但我还没有结果。
我是一名优秀的程序员,十分优秀!