Sammaye
Sammaye

Reputation: 43884

array_diff() removes elements from the result even if values match but keys are different

This is such a simple problem but the PHP doc does not explain why it is happening.

I have this code:

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

For briefity I am going to omit large parts of the structure I am actually using (since each is 117 elements long) and cut to the case.

I have one array called $newattributes which looks like:

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

And another called $oldattributes which looks like:

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

Which looks different right? According to array_diff: no. The output I get from array_diff is:

array(0) { } 

I have read the documentation page however it says:

Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.

And I am not sure how "1" can object equal "0".

Am I seeing some caveat with array_diff() that I didn't take into consideration?

Upvotes: 10

Views: 1889

Answers (2)

DonSeba
DonSeba

Reputation: 2119

The problem might reside in the fact that you are using associative arrays : you should try and use the following for associative arrays : array_diff_assoc():

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

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

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

    var_dump($result);
?>

result :

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

Upvotes: 11

dan-lee
dan-lee

Reputation: 14502

It does happen to me too (when there are more values than one)

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

For a full array_diff you need to make some extra work, because in default it returns a relative complement

Try this:

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

Result:

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

Upvotes: 2

Related Questions