10

这是一个如此简单的问题,但 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"
}

哪个看起来不一样?根据array_diff:没有。我得到的输出array_diff是:

array(0) { } 

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

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

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

那么我是否看到了一些array_diff我没有考虑到的警告?

4

2 回答 2

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)
   }
于 2012-08-17T10:53:49.713 回答
2

也确实发生在我身上(当值多于一个时)

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

对于完整的array_diff,您需要做一些额外的工作,因为默认情况下它返回一个相对补码

试试这个:

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

结果:

Array
(
    [bla] => test
    [deleted] => 0
)
于 2012-08-17T10:52:46.980 回答