phparraysfilterassociative-arrayarray-difference

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?


Solution

  • 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)
       }