我的代码中有一个例程,用于计算两个数组之间的差异,以便创建SQL UPDATE语句。
一旦例程开始,我就创建一个输入数组的副本,以便在输入数据保持不变的情况下对其进行操作。当我准备创建UPDATE语句时,我计算它们之间的差异,使用修改后的数组作为前导数据。
在我运行的每个测试中,两个数组都填充了键=值对,所有值都是字符串,即使它们在数据库中的整数(PDO行为),直到现在一切都完美无瑕。
但是现在我发现了一些奇怪的东西。两个不同的控制器中的两个不同的操作,但具有相同的逻辑,产生了不同的差异:
这个按预期工作:
$input = array(
'tid' => '3',
'enabled' => '1'
);
$modified = array(
'tid' => '3',
'enabled' => 0,
'modified' => '2014-11-26 15:17:55'
};
$diff = array(
'enabled' => 0,
'modified' => '2014-11-26 15:17:55'
);
$ input 是查询的结果。 $ modified 是通过类方法操作的第一个数组的副本。当我准备创建语句时,会计算 $ diff ,以便向PDO(或其他驱动程序)发送正确的语句。
这里,array_diff()有效。 tid 索引存在于两个数组中,并被忽略。 已启用,一个简单的开/关标志,是不同的,它包含在内。日期时间表示。
但看看另一个案例的变量:
$input2 = array(
'sid' => '1',
'finished' => '0'
);
$modified2 = array(
'sid' => '1',
'finished' => 1,
'modified' => '2014-11-26 15:21:58'
);
$diff2 = array(
'modified' => '2014-11-26 15:21:58'
);
与之前相同但具有不同的字段名称。 sid 会被忽略,但已完成也会被忽略,因为它不会出现在 $ input 中。
通过将array_diff()替换为array_diff_assoc(),正如预期的那样,一切正常,但为什么呢?
答案 0 :(得分:3)
来自docs:
array array_diff(array $ array1,array $ array2 [,array $ ...])
将array1与一个或多个其他数组进行比较并返回 array1中的值,不存在于任何其他数组中。
在您的示例中,$modified2
有一个条目已完成'它的值为1.但$input2
对于密钥'也具有值1。因此,使用array_diff($modified2, $input2)
将导致删除值为1的每个条目,无论密钥是什么。
使用array_diff_assoc
,只会检查$input2
是否已完成条目' => 1,它没有,所以不会删除条目。