2012-08-17 123 views
10

这是一个很简单的问题,但PHP文档并没有解释它为什么会发生。PHP array_diff奇怪

我有这样的代码:

var_dump($newattributes); var_dump($oldattributes); 
var_dump(array_diff($newattributes, $oldattributes)); 

对于briefity我将省略我实际使用(因为每个是117个元件长)并切割成的情况下的结构的大部分地区。

我已经一个阵列称为$newattributes它看起来像:

array(117){ 
    // Lots of other attributes here 
    ["deleted"] => int(1) 
} 

而另一个名为$oldattributes它看起来像:

array(117){ 
    // Lots of other attributes here 
    ["deleted"] => string(1) "0" 
} 

它看起来不同吧?根据array_diff:没有。我从array_diff得到的输出是:

​​

我已阅读文档页面但是它说:

两个因素被认为是平等的,当且仅当(字符串)$ elem1 === (字符串)$ elem2。用词表示:当字符串表示是相同的。

而我不知道“1”如何反对等于“0”。

所以我看到一些警告array_diff我没有考虑到?

+3

好问题清楚,问得好,不要太长,代码太多。更多的人应该这样做! +1 – Hidde 2012-08-17 10:41:34

+2

这不应该发生,事实上[它不适合我](http://ideone.com/jDeUd)。 – Jon 2012-08-17 10:42:51

+0

@Jon感谢您的测试,我会更多地关注我的PHP构建 – Sammaye 2012-08-17 10:47:37

回答

11

可能驻留在事实上,你正在使用关联数组的问题:你应该尝试使用下面的关联数组:array_diff_assoc()

<?php 
    $newattributes = array(
     "deleted" => 1 
    ); 

    $oldattributes = array(
     "deleted" => "0" 
    ); 

    $result = array_diff_assoc($newattributes, $oldattributes); 

    var_dump($result); 
?> 

结果:

array(1) { 
     ["deleted"]=> 
     int(1) 
    } 
+0

是的工作,哇,这只是疯了 – Sammaye 2012-08-17 10:56:00

+0

欢迎您:) PHP是一种非常宽容的语言,知道正确的功能有时通常是正确的把戏。 – DonSeba 2012-08-17 10:57:08

+0

+1。你有很棒的精神状态。关联数组! – Karma 2012-08-17 11:02:21

2

发生在我身上太(当有更多的价值比一个)

$new = array('test' => true, 'bla' => 'test' 'deleted' => 1); 
$old = array('test' => true, 'deleted' => '0'); 

对于和array_diff你需要做一些额外的工作,因为在默认情况下它返回一个relative complement

试试这个:

array_diff(array_merge($new, $old), array_intersect($new, $old)) 

结果:

Array 
(
    [bla] => test 
    [deleted] => 0 
) 
+0

事实上,这是有用的感谢,我采取了另一个答案作为标记的一个,因为它不需要合并或相交,但+1是第一次一个工作和支持数学,这是prolly什么时候比较联想 – Sammaye 2012-08-17 10:58:45

+0

做什么PHP的做法是一样的:array_diff_assoc()。很棒的发现虽然:) +1 – DonSeba 2012-08-17 10:59:13

+0

Yeahh,'array_diff_assoc'显然更容易,不知道。 SO是学习额外东西的好工具:) – 2012-08-17 11:54:31