2012-08-17 7 views
10

Jest to taki prosty problem, ale dokumentacja PHP nie wyjaśnia, dlaczego tak się dzieje.PHP array_diff weirdness

mam ten kod:

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

Dla briefity mam zamiar pominąć dużej części struktury Jestem rzeczywiście przy użyciu (ponieważ każdy z nich jest 117 elementów długo) i przyciąć do sprawy.

Mam jedną macierz nazywa $newattributes który wygląda tak:

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

a inny o nazwie $oldattributes który wygląda tak:

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

Która wygląda inaczej, prawda? Według array_diff: nie. Wyjście dostaję od array_diff jest:

array(0) { } 

Czytałem stronę dokumentacji jednak mówi:

Dwa elementy są uznawane za równe wtedy i tylko wtedy jeśli (string) $ elem1 === (ciąg) $ elem2. W słowach: gdy reprezentacja ciągów jest taka sama.

I nie jestem pewien, jak "1" może sprzeciwić się "0".

Więc widzę pewne zastrzeżenie z array_diff Nie brałem pod uwagę?

+3

Dobry pytanie, jasne, dobrze zadawane i nie za długie i za dużo kodu. Więcej ludzi powinno robić to w ten sposób! +1 – Hidde

+2

To nie powinno się zdarzyć, i rzeczywiście [to nie dla mnie] (http://ideone.com/jDeUd). – Jon

+0

@Jon Dzięki za test, zajrzę więcej w moją kompilację PHP – Sammaye

Odpowiedz

11

Problem może znajdować się na tym, że używasz tablic asocjacyjnych: należy spróbować użyć następującej za asocjacyjnych: array_diff_assoc():

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

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

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

    var_dump($result); 
?> 

wynik:

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

Tak, zadziałało, wow to jest po prostu szalone – Sammaye

+0

serdecznie zapraszamy :) PHP jest językiem bardzo wyrozumiałym, znając odpowiednie funkcje, zwykle robi to z prawą sztuczką. – DonSeba

+0

+1. Masz niesamowitą obecność umysłu. Tablice asocjacyjne! – Karma

2

To ma się ze mną też (gdy istnieje więcej wartości niż jeden)

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

Dla pełnej array_diff trzeba wykonać jakąś dodatkową pracę, ponieważ domyślnie zwraca relative complement

Spróbuj tego:

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

Wynik:

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

Rzeczywiście działa to dzięki, wzięłam inną odpowiedź jako oznaczoną, ponieważ nie potrzebuje scalenia ani przecięcia, ale +1 za pierwsze z matematyka działająca i wspierająca, jest to bardzo użyteczne, co robi PHP porównując assoc – Sammaye

+0

To obejście działa tak samo jak: array_diff_assoc(). świetne znalezisko :) +1 – DonSeba

+0

Yeahh, 'array_diff_assoc' oczywiście jest o wiele łatwiejsze, nie wiedziałem o tym. SO jest świetnym narzędziem do nauki dodatkowych rzeczy :) –