PHP array_diff怪异

时间:2012-08-17 10:39:16

标签: php

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

我有这段代码:

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

为简单起见,我将省略我实际使用的大部分结构(因为每个元素长117个元素)并切入案例。

我有一个名为$newattributes的数组,它看起来像:

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

另一个叫$oldattributes,看起来像:

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

哪个看起来不一样吧?根据{{​​1}}:没有。我从array_diff获得的输出是:

array_diff

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

  

当且仅当(字符串)$ elem1 ===时,才认为两个元素相等   (字符串)$ elem2。用文字表示:当字符串表示相同时。

而且我不确定“1”如何反对等于“0”。

所以我看到array(0) { } 的一些警告我没有考虑到?

2 个答案:

答案 0 :(得分: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)
   }

答案 1 :(得分: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
)