2012-08-17 6 views
10

Das ist so ein einfaches Problem, aber das PHP-Dokument erklärt nicht, warum es passiert.PHP Array_diff Seltsamkeit

Ich habe diesen Code:

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

Für briefity ich große Teile der Struktur verzichten werde ich tatsächlich verwenden bin (da jeder 117 Elemente lang ist) und auf den Fall schneiden.

Ich habe ein Array namens $newattributes, die wie folgt aussieht:

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

Und ein anderes genannt $oldattributes, die wie folgt aussieht:

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

Welche unterschiedlichen richtig aussieht? Nach array_diff: nein. Der Ausgang I von array_diff erhalten ist:

array(0) { } 

ich die Dokumentation Seite gelesen haben, aber es sagt:

Zwei Elemente werden als gleich betrachtet, wenn und nur wenn (string) $ elem1 === (string) $ elem2. In Worten: wenn die Zeichenfolgendarstellung gleich ist.

Und ich bin mir nicht sicher, wie "1" gleich "0" objektieren kann.

Also sehe ich einen Vorbehalt mit array_diff Ich habe nicht berücksichtigt?

+3

Gut Frage, klar, gut gefragt und nicht zu lang und zu viel Code. Mehr Leute sollten es so machen! +1 – Hidde

+2

Dies sollte nicht passieren, und zwar [es tut mir nicht] (http://ideone.com/jDeUd). – Jon

+0

@Jon Danke für den Test, ich werde mehr in meine PHP Build – Sammaye

Antwort

11

Das Problem könnte in der Tatsache liegen, dass Sie assoziative Arrays verwenden: Sie sollten versuchen, die folgenden für assoziative Arrays verwenden: array_diff_assoc():

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

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

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

    var_dump($result); 
?> 

Ergebnis:

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

Ja, das hat funktioniert, wow das ist nur verrückt – Sammaye

+0

Sie sind willkommen :) PHP ist eine sehr fehlerverzeihende Sprache, zu wissen, die richtigen Funktionen manchmal macht den richtigen Trick. – DonSeba

+0

+1. Du hast eine großartige Geistesgegenwart. Assoziative Arrays! – Karma

2

Es hat mir passieren auch (wenn es mehr Werte als einer sind)

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

Für eine voll array_diff Sie einige zusätzliche Arbeit machen müssen, weil in Standard es eine relative complement

zurück

Try this:

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

Ergebnis:

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

In der Tat, dass funktioniert, habe ich die andere Antwort als die markierte genommen, da es nicht die Zusammenführung oder Schnittpunkt aber +1 für die erste mit eine funktionierende und unterstützende Mathematik, das ist prolly, was PHP tut, wenn man assoc vergleicht – Sammaye

+0

Das funktioniert genauso wie: array_diff_assoc(). groß finden obwohl :) +1 – DonSeba

+0

Yeahh, 'array_diff_assoc' ist offensichtlich viel einfacher, wusste das nicht. SO ist ein großartiges Werkzeug, um zusätzliche Dinge zu lernen :) –