10

これは非常に単純な問題ですが、PHPのドキュメントではなぜそれが起こっているのか説明されていません。

私はこのコードを持っています:

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

簡単にするために、実際に使用している構造の大部分を省略し(それぞれが117要素の長さであるため)、ケースにカットします。

$newattributes次のような配列が1つあります。

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の場合に限り、2つの要素は等しいと見なされます。つまり、文字列表現が同じ場合。

そして、私は「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 に答える