array_diff()奇怪的行为

时间:2014-11-26 18:11:50

标签: php arrays behavior array-difference

我的代码中有一个例程,用于计算两个数组之间的差异,以便创建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(),正如预期的那样,一切正常,但为什么呢?

1 个答案:

答案 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,它没有,所以不会删除条目。